iOS 小册iOS Developer

GCD 之快速迭代(dispatch_apply)

2016-12-01  本文已影响130人  fuyoufang

dispatch_apply 快速迭代

类似 for 循环,但是在并发队列的情况下 dispatch_apply 会并发执行 block 任务。因为可以并行执行,所以使用 dispatch_apply 运行地更快。需要注意的是,dispatch_apply 这个是会阻塞主线程的。

在主线程上调用 dispatch_apply 方法:

NSLog(@"begin");
dispatch_queue_t asyncQueue = dispatch_queue_create("asdf", DISPATCH_QUEUE_CONCURRENT);
dispatch_apply(3, asyncQueue, ^(size_t index) {
    NSLog(@"%zu", index);
});
NSLog(@"end");
print("begin")
DispatchQueue.concurrentPerform(iterations: 3, execute: {
    index in
    print(index)
})
print("end")

输出:

begin
0
1
2
end

如果在 for 循环中使用 dispatch_async, 需要管理好线程的数量,否则会发生线程爆炸或死锁。而 dispatch_apply 是由 GCD 会管理并发的,可以碧避免上述情况发生。

dispatch_queue_t concurrentQueue = dispatch_queue_create("com.starming.gcddemo.concurrentqueue",DISPATCH_QUEUE_CONCURRENT);
//有问题的情况,可能会死锁
for (int i = 0; i < 999 ; i++) {
    dispatch_async(concurrentQueue, ^{
        NSLog(@"wrong %d",i);
        //do something hard
    });
}
//会优化很多,能够利用GCD管理
dispatch_apply(999, concurrentQueue, ^(size_t i){
    NSLog(@"correct %zu",i);
    //do something hard
});
上一篇 下一篇

猜你喜欢

热点阅读