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, 信号量.

你可能感兴趣的:(dispatch_group(队列组)处理异步任务)