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(@"走后执行");

执行结果

dispatch_group在开发过程中的应用_第1张图片
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(@"异步执行");

执行结果

dispatch_group在开发过程中的应用_第2张图片
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(@"异步执行");

执行结果

dispatch_group在开发过程中的应用_第3张图片
Paste_Image.png
  // 下面两种方法是相同的 没发现什么区别
    dispatch_group_async(group, queue, ^{ 
});

    dispatch_group_enter(group);dispatch_async(queue, ^{  
  dispatch_group_leave(group);
});

你可能感兴趣的:(dispatch_group在开发过程中的应用)