GCD实现多个网络请求同步执行
Posted 梦想的码农
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了GCD实现多个网络请求同步执行相关的知识,希望对你有一定的参考价值。
1.dispatch_group_async、dispatch_group_t与dispatch_group_notify 再配合dispatch_group_enter(group)和dispatch_group_leave(group)两个函数一起来使用,这样才能实现我们想要的最终效果。
2.dispatch_group_enter(dispatch_group_t group);
参数group不能为空,在异步任务开始前调用。它明确的表明了一个block被加入到了队列组group中,此时group中的任务的引用计数会加1(类似于OC的内存管理),dispatch_group_enter(group)必须与dispatch_group_leave(group)配对使用,它们可以在使用dispatch_group_async时帮助你合理的管理队列组中任务的引用计数的增加与减少。
3.dispatch_group_leave(dispatch_group_t group);
参数group不能为空,在异步任务成功返回后调用。它明确的表明了队列组里的一个block已经执行完成,队列组中的任务的引用计数会减1,它必须与dispatch_group_enter(group)配对使用,dispatch_group_leave(group)的调用次数不能多于dispatch_group_enter(group)的调用次数。
当队列组里的任务的引用计数等于0时,会调用dispatch_group_notify函数。具体代码实现如下:
@property(nonatomic,strong) dispatch_group_t disGroup;
- (void)requestDatas {
dispatch_queue_tqueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,0); dispatch_group_enter(self.disGroup);
dispatch_group_enter(self.disGroup);
dispatch_group_enter(self.disGroup);
dispatch_group_async(self.disGroup, queue, ^{
[self requestHomeWorks];
});
dispatch_group_async(self.disGroup, queue, ^{
[self requestHomeBanner];
});
dispatch_group_async(self.disGroup, queue, ^{
[self requestHomeAdvInfos];
});
dispatch_group_notify(self.disGroup, dispatch_get_main_queue(), ^{
NSLog(@"4");
[self.collectionView reloadData];
});
}
- (void)requestHomeWorks {
[[SFAPIManager sharedManager] requestDataWithPath:kHomeWorksPath params:nil completeBlock:^(id result,NSError *error) {
NSLog(@"1");
dispatch_group_leave(self.disGroup);
}];
}
以上是关于GCD实现多个网络请求同步执行的主要内容,如果未能解决你的问题,请参考以下文章
使用GCD中的dispatch_semaphore(信号量)处理一个界面多个请求(把握AFNet网络请求完成的正确时机)
GCD使用dispatch_semaphore_t创建多线程网络同步请求
使用GCD单个页面多个网络请求的情况(依次调用接口),等待所有网络请求结束后,再刷新UI