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); 

 }];

}

猜你喜欢

转载自www.cnblogs.com/zhengweifang/p/11447332.html