GCD学习之——Dispatch Group

Dispatch Group
在追加到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_PRIOROTY_DEFAULT,0);
dispatch_group_t group = dispatch_group_create();

dispatch_group_async(group,queue,^{NSLog(@"blk0");p});
dispatch_group_async(group,queue,^{NSLog(@"blk1");p});
dispatch_group_async(group,queue,^{NSLog(@"blk2");p});

dispatch_group_notify(group,dispatch_get_main_queue(),^{NSLog(@"done");});
dispatch_release(group);

执行结果为:

blk1
blk2
blk0
done

因为向Global Dispatch Queue即Concurrent Dispatch Queue追加处理,多个线程并行执行,所以追加处理的执行顺序不定。执行时会发生变化,但是此执行结果的done一定是最后输出的。
无论向什么样的Dispatch Queue追加处理,使用Dispatch Group都可监视这些处理执行的结束。一旦检测到所有处理执行结束,就可将结束的处理追加到Dispatch Queue中。这就是使用Dispatch Group的原因。
首先dispatch_group_create函数生成的dispatch_group_t类型的Dispatch Group。如dispatch_group_create函数名中所含的create所示,该Dispatch Group与Dispatch Queue相同,在使用结束后需要通过dispatch_release函数释放。
dispatch_group_async函数与dispatch_async函数相同,都追加Block到指定的Dispatch Queue中。与dispatch_async函数不同的是指定生成的Dispatch Group为第一个参数。指定的Block属于指定的Dispatch Group。
另外,与追加Block到Dispatch Queue时同样,Blocks通过dispatch_retain函数持有Dispatch Group,从而使得该Block属于Dispatch Group。这样如果Block执行结束,该Block就通过dispatch_release函数释放持有的Dispatch Group。一旦Dispatch Group使用结束,不用考虑属于该Dispatch Group的Block,立即通过dispatch_release函数释放即可。
在在追加到Dispatch Group中的处理全部执行结束时,该源代码中使用的dispatch_group_notify函数会将执行的Block追加到Dispatch Queue中,将第一个参数指定为要监视的Dispatch Group。在追加到该Dispatch Group的全部处理执行结束时,将第三个参数的Block追加到第二个参数的Dispatch Queue中。在dispatch_group_notify函数中不管制定什么样的Dispatch Queue,属于Dispatch Group的全部处理在追加指定的Block时都已执行结束。
另外,在Dispatch Group中也可使用dispatch_group_wait函数仅等待全部处理执行结束。

dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIOROTY_DEFAULT,0);
dispatch_group_t group = dispatch_group_create();

dispatch_group_async(group,queue,^{NSLog(@"blk0");p});
dispatch_group_async(group,queue,^{NSLog(@"blk1");p});
dispatch_group_async(group,queue,^{NSLog(@"blk2");p});

dispatch_group_wait(group,DISPATCH_TIME_FOREVER);
dispatch_release(group);

dispatch_group_wait函数的第二个参数指定为等待的时间(超时).它属于dispatch_time_t类型的值。该源代码使用DISPATCH_TIME_FOREVER,意味着永久等待。只要属于Dispatch Queue的处理尚未执行结束,就会一直等待,中途不能取消。

你可能感兴趣的:(ios,Dispatch,group,gcd)