dispatch_group_enter和dispatch_group_leave的使用

dispatch_group_enter和dispatch_group_leave的使用,这两个方法用于把一个异步任务加入group里。
首先,这两个一定要成对使用,不然会crash。
一般我们要把一个任务加入一个group里是这样:
dispatch_group_async(group, queue, ^{
    block();
});
这个写法等价于
dispatch_async(queue, ^{
    dispatch_group_enter(group);
    block()
    dispatch_group_leave(group);
});
如果要把一个异步任务加入group,这样就行不通了:
dispatch_group_async(group, queue, ^{
    [self performBlock:^(){
        block();
    }];
    //未执行到block() group任务就已经完成了
});
这时需要这样写:
dispatch_group_enter(group);
[self performBlock:^(){
    block();
    dispatch_group_leave(group);
}];
异步任务回调后才算这个group任务完成。
其实这跟retain/release差不多,都是计数,dispatch_group_enter时任务数+1,dispatch_group_leave时任务数-1,任务数为0时执行dispatch_group_notify的内容。

评论

此博客中的热门博文

使__attribute__((annotate("xxx")))能作用于OC函数

viewWillAppear不执行的解决办法

iOS中使用xpc/xpc.h