一般情况下,使用dispatch_group_async(group,queue,^{})和dispatch_group_notify(group,queue,^{})结合使用可以做到等group中任务执行完后再执行最后任务,但是当queue block中任务也自带block块的话,就有可能会造成其真正想执行的任务被跳过,顺序被打乱.所以可以使用dispatch_group_enter(group)和dispatch_group_leave(group)结合起来,当queue中的任务开始与结束时分别添加上诉代码,就可防止上诉情况发生.
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0); dispatch_group_t group = dispatch_group_create(); dispatch_group_async(group, queue, ^{ for (int i =0; i<self.pointArr.count; i++) { dispatch_group_enter(group); NSDictionary *dict = self.pointArr[i]; [NetworkAsk savePointInProject:self.projectId andPoint:dict[@"name"] andName:dict[@"name"] andX:dict[@"x"] andY:dict[@"y"] andZ:dict[@"z"] andB:dict[@"b"] andL:dict[@"l"] andH:dict[@"h"] Completion:^(NSDictionary *dic) { NSNumber *code = dic[@"code"]; if (code.intValue == 2) { self.index +=1; } dispatch_group_leave(group); }]; } }); dispatch_group_notify(group, queue, ^{ if ((unsigned long)self.index == self.pointArr.count -1) { [SVProgressHUD showSuccessWithStatus:@"保存成功"]; } });