Swift GCD任务组

GCD的任务组在开发中是经常被使用到,当需要一组任务结束后再执行一些操作时,就可以用它啦。

DispatchGroup的职责就是当队列中的所有任务都执行完毕后,会发出一个通知来告诉告诉大家,任务组中所执行的队列中的任务执行完毕了。

既然是组,里面就肯定有很多队列,不然怎么能叫做“组”。

队列和组关联有两种方式:手动、自动。

  1. 自动关联
func useGroupQueue() {
    let group = DispatchGroup()
    //模拟循环建立几个全局队列
    for index in 0...3 {

//创建队列的同时,加入到任务组中        
DispatchQueue.global().async(group: group, execute: DispatchWorkItem.init(block: {
            Thread.sleep(forTimeInterval: TimeInterval(arc4random_uniform(2) + 1))
            print("任务\(index)执行完毕")
        }))
    }
    
    //组中所有任务都执行完了会发送通知
    group.notify(queue: DispatchQueue.main) {
        print("任务组的任务都已经执行完毕啦!")
    }
    
    
    print("打印测试一下")
}


打印结果:


image.png
  1. 手动关联
    enter(),leave()是一起使用。前者表示进入到任务组。后者表示离开任务组。
let manualGroup = DispatchGroup()
//模拟循环建立几个全局队列
for manualIndex in 0...3 {
    
    //进入队列管理
    manualGroup.enter()
    DispatchQueue.global().async {
        //让线程随机休息几秒钟
        Thread.sleep(forTimeInterval: TimeInterval(arc4random_uniform(2) + 1))
        print("-----手动任务\(manualIndex)执行完毕")
        
        //配置完队列之后,离开队列管理
        manualGroup.leave()
    }
}

//发送通知
manualGroup.notify(queue: DispatchQueue.main) {
    print("手动任务组的任务都已经执行完毕啦!")
}

打印结果:


image.png

利用任务组可以完成很多场景的工作。例如多任务执行完后,统一刷新UI。把刷新UI的操作放在notify里面就好了。

你可能感兴趣的:(Swift GCD任务组)