dispatch_group在开发过程中的应用

今天我们来说说dispatch_group在开发过程中的应用。

  • 我决定每篇文章的开头都会放上福利。

![0QE1_)${@(K3]~HO]@HT]E5.jpg](http://upload-images.jianshu.io/upload_images/1436009-b226ccaab07aac58.jpg?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

在实际开发中我们会遇到这样一种需求:某个页面加载时通过网络请求获得相应的数据,再做某些操作,有时候加载的内容需要通过好几个接口的数据组合而成,比如有两个请求A和B,我们通常为了省事,会将B请求放在A请求成功的回调中发起,在B的成功回调中将数据组合起来,这样做有明显的问题:

  • 请求如果多了,需要写许多嵌套的请求
  • 如果在除了最后一个请求前的某个请求失败了,就不会执行后面的请求,数据无法加载
  • 请求变成同步的,这是最大的问题,在网络差的情况下,如果有n个请求,意味着用户要等待n倍于并发请求的时间才能看到内容。

接下来我们就来解决这个问题。

dispatch_group_wait

dispatch_group_wait会同步地等待group中所有的block执行完毕后才继续执行

      NSLog(@"第一个执行");
// 创建一个group
dispatch_queue_t queue = dispatch_queue_create("queue", DISPATCH_QUEUE_CONCURRENT);
dispatch_group_t group = dispatch_group_create();
dispatch_group_async(group,queue,^{
    NSLog(@"线程1");
});
dispatch_group_async(group,queue,^{
    NSLog(@"线程2");
});
dispatch_group_wait(group,DISPATCH_TIME_FOREVER);
NSLog(@"走后执行");

执行结果

Paste_Image.png
      dispatch_queue_t queue = dispatch_queue_create("queue", DISPATCH_QUEUE_CONCURRENT);
dispatch_group_t group = dispatch_group_create();
dispatch_group_async(group,queue,^{
    NSLog(@"线程一");
});
dispatch_group_async(group,queue,^{
    NSLog(@"线程二");
});
dispatch_group_notify(group, dispatch_get_main_queue(), ^{
    NSLog(@"一和二完成");
});

NSLog(@"异步执行");

执行结果

Paste_Image.png
dispatch_group_enter dispatch_group_leave
        // 创建一个group
dispatch_group_t group = dispatch_group_create();
dispatch_queue_t queue = dispatch_queue_create("queue", DISPATCH_QUEUE_CONCURRENT);

dispatch_group_enter(group);
dispatch_async(queue, ^{
    NSLog(@"线程一");
    dispatch_group_leave(group);

});
dispatch_group_enter(group);
dispatch_async(queue, ^{
    NSLog(@"线程二");
    dispatch_group_leave(group);
    
});

 //等待group完成所有异步操作
dispatch_group_notify(group, dispatch_get_main_queue(), ^{
    
    NSLog(@"一二俩个执行完最后走");
});

NSLog(@"异步执行");

执行结果

Paste_Image.png
  // 下面两种方法是相同的 没发现什么区别
    dispatch_group_async(group, queue, ^{ 
});

    dispatch_group_enter(group);dispatch_async(queue, ^{  
  dispatch_group_leave(group);
});
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • __block和__weak修饰符的区别其实是挺明显的:1.__block不管是ARC还是MRC模式下都可以使用,...
    LZM轮回阅读 3,397评论 0 6
  • 同步/异步 同步:多个任务情况下,一个任务A执行结束,才可以执行另一个任务B。只存在一个线程也就是主线程。 异步:...
    XLsn0w阅读 310评论 0 0
  • Managing Units of Work(管理工作单位) 调度块允许您直接配置队列中各个工作单元的属性。它们还...
    edison0428阅读 8,062评论 0 1
  • 一、招募与面试的流程有几步?是什么? 首先非常感谢大鹏老师的分享,通过大鹏老师的分享可得知。招募与面试的流程大概分...
    王一碗_e7dd阅读 288评论 0 0
  • 周末,十点,阳光从没遮严的窗帘缝隙悄悄钻进来,泼洒整整一卧室的金子。拥一床棉被,一双瞌睡的眼,迟迟不愿醒来。八点左...
    清浅光阴阅读 437评论 0 0