首先需要定义一个group:
@property (nonatomic,strong)dispatch_group_t group;
其次所有的网络请求放在一个方法中方便查看
-
(void)dispatch_group_network
{
// 请求多个网络请求, 并监听所有网络请求都结束.
// 创建一个组
self.group = dispatch_group_create();
dispatch_queue_t serialQueue = dispatch_queue_create("com.benben.zhixun", DISPATCH_QUEUE_SERIAL);
// 网络请求 1
{
// 进入组
dispatch_group_enter(self.group);
dispatch_group_async(self.group, serialQueue, ^{
[self getCategoryRequest];
NSLog(@"网络请求 1 结束 %@", [NSThread currentThread]);
});
}// 网络请求 2
{
// 进入组
dispatch_group_enter(self.group);
// 假装这里有一个网络请求
dispatch_group_async(self.group, serialQueue, ^{
[self bannerRequest];
NSLog(@"网络请求 2 结束 %@", [NSThread currentThread]);
});
}// 所有子线程任务全部完成, 并回到主线程
dispatch_group_notify(self.group, dispatch_get_main_queue(), ^{
NSLog(@"所有请求结束 %@", [NSThread currentThread]);
// 最后更新UI,刷新数据
[self.mainCollectionView reloadData];
});
}
每一个子进程任务结束, 退出组
平时在进行多线程处理任务时,有时候希望多个任务之间存在着一种联系,希望在所有的任务执行完后做一些总结性处理。
那么就可以将多个任务放在一个任务组中进行统一管理。dispatch提供了相应的API供我们完成这一需求。
结合到项目中,最多的使用场景是多个请求返回后,统一进行下一步的处理。在护眼模式请求护眼时间、以及百度BOS上传多张图片的时候,均使用了dispatch_group_t这一功能。
dispatch_group_t相关属性介绍
dispatch_group_async(group, queue, block);
将block任务添加到queue队列,并被group组管理
dispatch_group_enter(group);
声明dispatch_group_enter(group)下面的任务由group组管理,group组的任务数+1
dispatch_group_leave(group);
相应的任务执行完成,group组的任务数-1
dispatch_group_create();
创建一个group组
dispatch_group_wait(group1, DISPATCH_TIME_FOREVER);
当前线程暂停,等待dispatch_group_wait(group1, DISPATCH_TIME_FOREVER)上面的任务执行完成后,线程才继续执行。
dispatch_group_notify(group1, queue1,block);
监听group组中任务的完成状态,当所有的任务都执行完成后,触发block块,执行总结性处理。