美文网首页iOS学习开发iOS程序猿iOS学习
dispatch_group(队列组)处理异步任务

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

作者: chensifang | 来源:发表于2016-12-10 19:13 被阅读0次
    • 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(队列组)处理异步任务

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