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
});
相關文章
- iOS開發之GCDiOSGC
- 機器學習之迭代方法機器學習
- JavaScript 之迭代方法JavaScript
- javascript 之迭代器JavaScript
- IOS多執行緒之(GCD)iOS執行緒GC
- iOS 多執行緒之GCDiOS執行緒GC
- GCD 之執行緒死鎖GC執行緒
- IOS之GCD詳細步驟iOSGC
- STL之迭代器(iterator)
- C++之迭代器C++
- Python之可迭代物件、迭代器、生成器Python物件
- 深入理解GCD之dispatch_groupGC
- 深入理解GCD之dispatch_queueGC
- GCD原始碼分析之再解 sentinelGC原始碼
- GCD原始碼分析之base.hGC原始碼
- Java不用遞迴的迭代快速排序示例Java遞迴排序
- 前端靜態頁面快速迭代工具前端
- GCD Inside: GCD 宏GCIDE
- C++ STL之迭代器C++
- GCD之佇列的實現和使用GC佇列
- GCD與NSOperation之間的區別GC
- iOS多執行緒之GCD詳解iOS執行緒GC
- GCDGC
- Java 集合(2)之 Iterator 迭代器Java
- Python 擴充之迭代器Python
- # Swift 集合型別之迭代器Swift型別
- 設計模式之迭代器模式設計模式
- Altair SimSolid快速設計迭代的結構分析AISolid
- iOS GCD執行緒之間的通訊iOSGC執行緒
- iOS中多執行緒之GCD應用iOS執行緒GC
- GCD SUMGC
- GCD QueriesGC
- GCD Inside: GCD 資料結構GCIDE資料結構
- codechef Dynamic GCD [樹鏈剖分 gcd]GC
- 快速傅立葉變換的迭代法程式碼實現
- golang設計模式之迭代器模式Golang設計模式
- Go 陷阱之 for 迴圈迭代變數Go變數
- Javascript設計模式之迭代器模式JavaScript設計模式