iOS - dispatch_group

Posted qzcodediary

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了iOS - dispatch_group相关的知识,希望对你有一定的参考价值。

场景:分别异步执行2个耗时任务,然后当2个耗时任务都执行完毕后再回到主线程执行任务。这时候我们可以用到 GCD 的队列组

    • 调用队列组的 dispatch_group_async 先把任务放到队列中,然后将队列放入队列组中。或者使用队列组的 dispatch_group_enterdispatch_group_leave 组合 来实现dispatch_group_async
    • 调用队列组的 dispatch_group_notify 回到指定线程执行任务。或者使用 dispatch_group_wait 回到当前线程继续向下执行(会阻塞当前线程)。
    • dispatch_group_enter 标志着一个任务追加到 group,执行一次,相当于 group 中未执行完毕任务数+1
    • dispatch_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的主要内容,如果未能解决你的问题,请参考以下文章

使用dispatch_group来进行线程同步

dispatch_group的踩坑

第25月第26天 dispatch_group

多线程并发流程控制之dispatch_group 有关函数

iOS代码片段CodeSnippets

IOS开发-OC学习-常用功能代码片段整理