Dispatch Group
在追加到Dispatch Queue中的多个任务处理完毕之后想执行结束处理,这种需求会经常出现。如果只是使用一个Serial Dispatch Queue(串行队列)时,只要将想执行的处理全部追加到该串行队列中并在最后追加结束处理即可,但是在使用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
由打印结果可以看出,多个线程并行执行,所以追加处理的执行顺序不确定。执行顺序因此会发生变化,但此执行结果的done一定是最后输出的。这样一来我们就实现了文章开头的需求。