美文网首页学习iOS技术iOS Developer程序员
dispatch_group在开发过程中的应用

dispatch_group在开发过程中的应用

作者: iOSTbag | 来源:发表于2016-07-18 14:56 被阅读663次

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

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

    ![0QE1_)${@(K3]~HO]@HT]E5.jpg](http:https://img.haomeiwen.com/i1436009/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);
    });

    相关文章

      网友评论

      • 倪良伯:看到封面我就进来了!拉到底竟然没有福利二!
        iOSTbag:@倪良伯 不知道你想要什么福利? :sunglasses:
      • 马铃薯蜀黍:你点到了技术宅的死穴...
        iOSTbag:@马铃薯蜀黍 :sweat:什么死穴 我怎么不太懂呢 :sunglasses:
      • 王一航:时刻提醒自己是在看技术文章,不是在逛窑子😪
        iOSTbag:@王一航 有那么夸张么 你可以在窑子里学到技术:stuck_out_tongue_winking_eye:

      本文标题:dispatch_group在开发过程中的应用

      本文链接:https://www.haomeiwen.com/subject/jcwpjttx.html