码迷,mamicode.com
首页 > 移动开发 > 详细

iOS - dispatch_group

时间:2019-11-13 16:24:01      阅读:83      评论:0      收藏:0      [点我收藏+]

标签:异步   打印   format   string   执行   color   ring   结果   void   

场景:分别异步执行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

标签:异步   打印   format   string   执行   color   ring   结果   void   

原文地址:https://www.cnblogs.com/qzCodeDiary/p/11849967.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!