GCD的任务组在开发中是经常被使用到,当需要一组任务结束后再执行一些操作时,就可以用它啦。
DispatchGroup的职责就是当队列中的所有任务都执行完毕后,会发出一个通知来告诉告诉大家,任务组中所执行的队列中的任务执行完毕了。
既然是组,里面就肯定有很多队列,不然怎么能叫做“组”。
队列和组关联有两种方式:手动、自动。
- 自动关联
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
- 手动关联
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里面就好了。
网友评论