Dispatch Group
在追加到Dispatch Queue中的多個任務處理完畢之后想執(zhí)行結束處理,這種需求會經常出現(xiàn)。如果只是使用一個Serial Dispatch Queue(串行隊列)時,只要將想執(zhí)行的處理全部追加到該串行隊列中并在最后追加結束處理即可,但是在使用Concurrent Queue 時,可能會同時使用多個Dispatch Queue時,源代碼就會變得很復雜。
在這種情況下,就可以使用Dispatch Group。
- (void)GcdGroupexampleFirst {
dispatch_group_t group = dispatch_group_create();
dispatch_queue_t queue = dispatch_queue_create("com.gcd-jianshu.www", DISPATCH_QUEUE_CONCURRENT);
dispatch_group_async(group, queue, ^{
NSLog(@"group中的第一個--- %@",[NSThread currentThread]);
});
dispatch_group_async(group, queue, ^{
NSLog(@"group中的第二個--- %@",[NSThread currentThread]);
});
dispatch_group_async(group, queue, ^{
NSLog(@"group中的第三個--- %@",[NSThread currentThread]);
});
dispatch_group_notify(group, queue, ^{
NSLog(@"done");
});
}
控制臺打印結果:
2017-09-08 15:24:48.877 GcdInsightTest[70557:3031178] group中的第二個--- <NSThread: 0x600000077dc0>{number = 4, name = (null)}
2017-09-08 15:24:48.877 GcdInsightTest[70557:3031177] group中的第一個--- <NSThread: 0x608000073500>{number = 3, name = (null)}
2017-09-08 15:24:48.877 GcdInsightTest[70557:3031180] group中的第三個--- <NSThread: 0x608000265540>{number = 5, name = (null)}
2017-09-08 15:24:48.877 GcdInsightTest[70557:3031180] done
```Dispatch Group
由打印結果可以看出,多個線程并行執(zhí)行,所以追加處理的執(zhí)行順序不確定。執(zhí)行順序因此會發(fā)生變化,但此執(zhí)行結果的done一定是最后輸出的。這樣一來我們就實現(xiàn)了文章開頭的需求。