dispatch_group(队列组)处理异步任务

  • dispatch_group中都是同步事件情况

    例如任务3需要在任务1和任务2执行结束以后(任务1.2是并发执行的)再执行, 代码如下:

dispatch_group_t group = dispatch_group_create();
dispatch_queue_t queue = dispatch_queue_create("myQueue", DISPATCH_QUEUE_CONCURRENT);
dispatch_group_async(group, queue, ^{
[NSThread sleepForTimeInterval:2];
NSLog(@"任务1");
});

dispatch_group_async(group, queue, ^{
    [NSThread sleepForTimeInterval:4];
    NSLog(@"任务2");
});

dispatch_group_notify(group, queue, ^{
    NSLog(@"任务3");
});

- dispatch_group中有异步任务

    > 下面是Swift代码, 可以对照OC互相转换

  ```swift
      let queue = DispatchQueue.main // 拿到主队列
      let group = DispatchGroup() // 创建队列组
      
      group.enter() // 标志着任务1加入组
      queue.async (group: group) {
          // 任务1, 闭包的回调是在子线程
          self.task1() { () in 
              print("任务1回调完成")
              group.leave() // 标志着任务1回调完成
          }
      }

      group.enter() // 标志着任务2加入组
      queue.async (group: group) {
          self.task2() { () in
              print("任务2回调完成")
              group.leave() // 标志着任务2回调完成
          }
      }
      
      group.notify(queue: DispatchQueue.main) {
         print("任务1.2都回调完成")
      }

其实同步的时候, 系统会自动在任务前加上 group.enter(), 在任务后加上group.leave(), 成对的加, 当所有成对的group.enter()&&group.leave()执行完了, 系统再调用notify. 所以group中有异步任务时只需要自己显式地加上这对代码就可以了. 注意:这里的任务1&&任务2是并发执行的. 如果需要串行可以用到dispatch_semaphore, 信号量.

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

推荐阅读更多精彩内容

  • Managing Units of Work(管理工作单位) 调度块允许您直接配置队列中各个工作单元的属性。它们还...
    edison0428阅读 8,019评论 0 1
  • 一、简单介绍下将会用到的一些东西 英语不好就不翻译官方文档了.. 1、dispatch_group_async S...
    Albert新荣阅读 1,751评论 0 1
  • 3.GCD GCD的全称是Grand Central Dispatch,提供了非常多的纯C语言的函数 GCD的优势...
    Mario_ZJ阅读 492评论 0 0
  • dispatch_group 通常我们执行耗时操作会放到子线程中并发执行,这个过程中我们可能想知道各个任务全部执行...
    aSnail阅读 1,580评论 0 4
  • 通过这篇文章,再熟悉一下多线程,这里主要是根据自己的理解,来介绍一下多线程 iOS有三种多线程编程的技术,分别是:...
    pengmengli阅读 290评论 0 0