GCD的任務(wù)組在開發(fā)中是經(jīng)常被使用到涨缚,當(dāng)需要一組任務(wù)結(jié)束后再執(zhí)行一些操作時(shí),就可以用它啦不皆。
DispatchGroup的職責(zé)就是當(dāng)隊(duì)列中的所有任務(wù)都執(zhí)行完畢后蟆技,會(huì)發(fā)出一個(gè)通知來告訴告訴大家魄懂,任務(wù)組中所執(zhí)行的隊(duì)列中的任務(wù)執(zhí)行完畢了沿侈。
既然是組,里面就肯定有很多隊(duì)列市栗,不然怎么能叫做“組”缀拭。
隊(duì)列和組關(guān)聯(lián)有兩種方式:手動(dòng)、自動(dòng)填帽。
- 自動(dòng)關(guān)聯(lián)
func useGroupQueue() {
let group = DispatchGroup()
//模擬循環(huán)建立幾個(gè)全局隊(duì)列
for index in 0...3 {
//創(chuàng)建隊(duì)列的同時(shí)蛛淋,加入到任務(wù)組中
DispatchQueue.global().async(group: group, execute: DispatchWorkItem.init(block: {
Thread.sleep(forTimeInterval: TimeInterval(arc4random_uniform(2) + 1))
print("任務(wù)\(index)執(zhí)行完畢")
}))
}
//組中所有任務(wù)都執(zhí)行完了會(huì)發(fā)送通知
group.notify(queue: DispatchQueue.main) {
print("任務(wù)組的任務(wù)都已經(jīng)執(zhí)行完畢啦!")
}
print("打印測(cè)試一下")
}
打印結(jié)果:
- 手動(dòng)關(guān)聯(lián)
enter()篡腌,leave()是一起使用铣鹏。前者表示進(jìn)入到任務(wù)組。后者表示離開任務(wù)組哀蘑。
let manualGroup = DispatchGroup()
//模擬循環(huán)建立幾個(gè)全局隊(duì)列
for manualIndex in 0...3 {
//進(jìn)入隊(duì)列管理
manualGroup.enter()
DispatchQueue.global().async {
//讓線程隨機(jī)休息幾秒鐘
Thread.sleep(forTimeInterval: TimeInterval(arc4random_uniform(2) + 1))
print("-----手動(dòng)任務(wù)\(manualIndex)執(zhí)行完畢")
//配置完隊(duì)列之后,離開隊(duì)列管理
manualGroup.leave()
}
}
//發(fā)送通知
manualGroup.notify(queue: DispatchQueue.main) {
print("手動(dòng)任務(wù)組的任務(wù)都已經(jīng)執(zhí)行完畢啦葵第!")
}
打印結(jié)果:
利用任務(wù)組可以完成很多場(chǎng)景的工作绘迁。例如多任務(wù)執(zhí)行完后,統(tǒng)一刷新UI卒密。把刷新UI的操作放在notify里面就好了缀台。