在追加到Dispatch Queue中的多个处理全部结束后想执行结束处理,这种情况会经常出现。
只使用一个Serial Dispatch Queue时, 只要将想执行的处理全部追加到Serial Dispatch Queue中并在最后追加结束处理,即可实现。
使用Concurrent Dispatch Queue 时 或者同时使用多个Dispatch Queue时,源码就会变得颇为复杂。
在此种情况下使用Dispatch Group。
例如下面源代码:追加3个Block 到Global Dispatch Queue, 这些Block如果全部执行完毕,就会执行 Main Dispatch Queue中结束处理用的Block。
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
dispatch_group_t group = dispatch_group_create();
dispatch_group_async(group, queue, ^{NSLog(@"blk0");});
dispatch_group_async(group, queue, ^{NSLog(@"blk1")});
dispatch_group_async(group, queue, ^{NSLog(@"blk2")});
dispatch_group_notify(group, dispatch_get_main_queue(), ^{NSLog(@"done")});
dispatch_release(group);
因为向Global Dispatch Queue即Concurrent Dispatch Queue追加处理,多个线程并行执行,所以追加处理的执行顺序不定。但是执行结果的done一定是最后输出的。
无论向什么样的Dispatch Queue中追加处理,使用Dispatch Group都可监视这些处理执行的结束。一旦检测到所有处理执行结束,就可以将结束的处理追加到Dispatch Queue中。这就是使用Dispatch Group的原因。