dispatch_group_enter和dispatch_group_leave的使用
dispatch_group_enter和dispatch_group_leave的使用,这两个方法用于把一个异步任务加入group里。
首先,这两个一定要成对使用,不然会crash。
首先,这两个一定要成对使用,不然会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的内容。
评论
发表评论