iOS - dispatch_group
Posted qzcodediary
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了iOS - dispatch_group相关的知识,希望对你有一定的参考价值。
场景:分别异步执行2个耗时任务,然后当2个耗时任务都执行完毕后再回到主线程执行任务。这时候我们可以用到 GCD 的队列组
- 调用队列组的
dispatch_group_async
先把任务放到队列中,然后将队列放入队列组中。或者使用队列组的dispatch_group_enter
、dispatch_group_leave
组合 来实现dispatch_group_async
。 - 调用队列组的
dispatch_group_notify
回到指定线程执行任务。或者使用dispatch_group_wait
回到当前线程继续向下执行(会阻塞当前线程)。 dispatch_group_enter
标志着一个任务追加到 group,执行一次,相当于 group 中未执行完毕任务数+1dispatch_group_leave
标志着一个任务离开了 group,执行一次,相当于 group 中未执行完毕任务数-1
当 group 中未执行完毕任务数为0的时候,才会使dispatch_group_wait
解除阻塞,以及执行追加到dispatch_group_notify
中的任务。
嵌套的group
-(void)testDispatchGroup{ NSMutableArray *assets = [NSMutableArray array]; dispatch_group_t group0 = dispatch_group_create(); for (int i = 1; i <= 3; i++) { NSMutableArray *asset = [NSMutableArray array]; dispatch_group_enter(group0); dispatch_group_t group = dispatch_group_create(); dispatch_group_enter(group); dispatch_async(dispatch_get_main_queue(), ^{ sleep(3); NSLog(@"第%d次3s later",i); NSString *str = [NSString stringWithFormat:@"%d",i]; [asset addObject:str]; dispatch_group_leave(group); }); dispatch_group_enter(group); dispatch_async(dispatch_get_main_queue(), ^{ sleep(2); NSLog(@"第%d次2s later",i); dispatch_group_leave(group); }); dispatch_group_enter(group); dispatch_async(dispatch_get_main_queue(), ^{ NSLog(@"第%d次 OK",i); // dispatch_group_leave(group); }); dispatch_group_notify(group, dispatch_get_main_queue(), ^{ NSLog(@"全部OK!"); [assets addObject:asset]; dispatch_group_leave(group0); }); } dispatch_group_notify(group0, dispatch_get_main_queue(), ^{ NSLog(@"%@",assets); }); NSLog(@"...??"); }
打印结果:
内层的enter 对应的leave如果少了的话,是不会执行内层的notify,由于内部的notyfy没有执行则内层也没有leave掉group0,外层也不会执行。
以上是关于iOS - dispatch_group的主要内容,如果未能解决你的问题,请参考以下文章