dispatch_group在开发过程中的应用

165 阅读2分钟

今天我们来说说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);
});