將GCD任務集合起來
目的:將代碼塊集合到一起,確保他們在GCD機制下,一個接一個的執行,就像是相互依靠。
解決方法:dispatch_group_create 來建立集合
先了解下Group的四個方法:
- dispatch_group_create
- dispatch_group_async
- dispatch_group_notify
- dispatch_group_release
1和4搭配使用,2要指定調度隊列,3是允許你在添加到group中的所有任務執行完之後,彙總再執行別的任務。
實例:有三個方法我們想依次調用,都調用完了,然後再給用戶一個提示信息。
dispatch_group_t taskGroup = dispatch_group_create();
dispatch_queue_t mainQueue = dispatch_get_main_queue();
dispatch_group_async(taskGroup, mainQueue, ^{
[self reloadTableView];
});
dispatch_group_async(taskGroup, mainQueue, ^{
[self reloadScrollView];
});
dispatch_group_async(taskGroup, mainQueue, ^{
[self reloadImageView];
});
dispatch_group_notify(taskGroup, mainQueue, ^{
/**
* 自己隨便寫點什麼提示消息吧
*/
});
dispatch_release(taskGroup);//ARC下可以省略
C函數實現方法:略,不想寫了
創建你自己的GCD調度隊列
這樣創建的是serial queue(串行隊列),它將會用到:
dispatch_queue_create、dispatch_release、dispatch_async
其中create方法的第一個參數是一個C的字符串類型char*,第二個參數爲0。
而dispatch_async在這裏使用的原因是:dispatch_sync是FIFO原則執行,而一個隊列上的併發任務不會在主線程上執行,這個機制可以令串行隊列更加高效。
dispatch_queue_t firstSerialQueue =
dispatch_queue_create("com.company.product.serialQueue1", 0);
dispatch_async(firstSerialQueue, ^{
NSUInteger counter = 0;
for (counter = 0; counter<5; counter++) {
NSLog(@"First iteration, counter = %lu",(unsigned long)counter);
}
});
dispatch_async(firstSerialQueue, ^{
NSUInteger counter = 0;
for (counter = 0; counter<5; counter++) {
NSLog(@"Second iteration, counter = %lu",(unsigned long)counter);
}
});
dispatch_async(firstSerialQueue, ^{
NSUInteger counter = 0;
for (counter = 0; counter<5; counter++) {
NSLog(@"Third iteration, counter = %lu",(unsigned long)counter);
}
});
dispatch_release(firstSerialQueue);//ARC下不需要
打印出來的結果是
First iteration, counter = 0
First iteration, counter = 1
First iteration, counter = 2
First iteration, counter = 3
First iteration, counter = 4
Second iteration, counter = 0
Second iteration, counter = 1
Second iteration, counter = 2
Second iteration, counter = 3
Second iteration, counter = 4
Third iteration, counter = 0
Third iteration, counter = 1
Third iteration, counter = 2
Third iteration, counter = 3
Third iteration, counter = 4