在项目中经常会遇到多个网络请求需要并发执行的需求,我们可以通过GCD提供的dispatch_group
+dispatch_group_enter
+dispatch_group_leave
的方式实现并发执行的网络请求
dispatch_group_t group = dispatch_group_create();
dispatch_group_async(group,dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
// 追加任务1
dispatch_group_enter(group); //标志着一个任务追加到 group,执行一次,相当于 group 中未执行完毕任务数+1
//这里使用延迟方法来模拟网络请求时间,需要注意真实的网络请求无论成功或失败都需要调用dispatch_group_leave(group)方法任务数减一
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(2 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
dispatch_group_leave(group); //标志着一个任务离开了 group,执行一次,相当于 group 中未执行完毕任务
});
});
dispatch_group_async(group, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
// 追加任务2
dispatch_group_enter(group); //group 中未执行完毕任务数+1
//这里使用延迟方法来模拟网络请求时间
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(2 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
dispatch_group_leave(group); //标志着一个任务离开了 group,执行一次,相当于 group 中未执行完毕任务
});
});
dispatch_group_notify(group, dispatch_get_main_queue(), ^{
// 等前面的异步任务1、任务2都执行完毕后,回到主线程执行下边任务
[self.tableView reloadData];
});
多线程相关的知识请参考博客
iOS 多线程:『GCD』详尽总结