GCD 之快速迭代(dispatch_apply)

dispatch_apply 快速迭代

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

在主线程上调用 dispatch_apply 方法:

  • object-c
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");
  • swift 3.0
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
});
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容