GCD 之快速迭代(dispatch_apply)

weixin_33782386發表於2016-12-01

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

相關文章