在使用 dispatch_group_t 进行多个异步操作,任务完成时进行dispatch_group_notify,导致crash使用方法:
dispatch_group_enter()与dispatch_group_leave() 需要成对出现
dispatch_group_t group = dispatch_group_create();
dispatch_queue_t queque = dispatch_queue_create("com.doasync.operation.queue", DISPATCH_QUEUE_CONCURRENT);
dispatch_group_enter(group);
dispatch_group_async(group, queque, ^{
//do something
[self doSomething:^(id __Nullable info) {
dispatch_group_leave(group);
}];
}
dispatch_group_notify(group,queque, ^{
//finish notify
//do something
});
如果已经按照成对出现,依然出现 dispatch_group_leave()处crash,那么需要注意、检查异步时(自己做任务)的回调次数,也就是上面代码块中的
dispatch_group_async(group, queque, ^{
//do something
[self doSomething:^(id __Nullable info) {
//此处的回调次数 必须是一次 ,
// 因为如果多次则会有 dispatch_group_leave 多次,导致不匹配则出现crash
dispatch_group_leave(group);
}];
}
那么如何避免回调多次呢? 这就需要仔细查看 doSomething 逻辑:
1、 查看回调的地方是否存在多个地方? 如果存在多个地方则在回调完成后需要将其释放
2、如果是全局的 doSomething 回调为全局,在回调处可以将其置为nil