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

使用GCD单个页面多个网络请求的情况(依次调用接口),等待所有网络请求结束后,再刷新UI

NSURLConnection发送网络请求

Java 使用CountDownLatch实现网络同步请求,异步同时获取商品信息组装