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
});