学习iOS技术iOS Developer程序员

dispatch_group在开发过程中的应用

2016-07-18  本文已影响663人  iOSTbag

今天我们来说说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的成功回调中将数据组合起来,这样做有明显的问题:

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

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);
});
上一篇下一篇

猜你喜欢

热点阅读