当前位置:首页 > 移动开发 > 正文

iOS - dispatch_group

2024-03-31 移动开发

场景:分别异步执行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,外层也不会执行。

 

 

 

 

 

温馨提示: 本文由Jm博客推荐,转载请保留链接: https://www.jmwww.net/yidong/18302.html