码迷,mamicode.com
首页 > 其他好文 > 详细

GCD实现多个网络请求同步执行

时间:2019-09-02 16:58:42      阅读:102      评论:0      收藏:0      [点我收藏+]

标签:block   with   内存   efault   gcd实现   nbsp   lob   代码   异步任务   

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实现多个网络请求同步执行

标签:block   with   内存   efault   gcd实现   nbsp   lob   代码   异步任务   

原文地址:https://www.cnblogs.com/zhengweifang/p/11447332.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!