應(yīng)用場景:一個頁面有6個請求,請求完畢后統(tǒng)一刷新UI
基礎(chǔ)使用:
func initData() -> Void {
let group = DispatchGroup()
let queue = DispatchQueue.global()
queue.async(group: group, execute: {
uLog("11111111")
})
queue.async(group: group, execute: {
uLog("222")
})
queue.async(group: group, execute: {
uLog("3333")
})
queue.async(group: group, execute: {
uLog("4444")
})
queue.async(group: group, execute: {
uLog("555")
})
///只要任務(wù)全部完成了,就會在最后調(diào)用
group.notify(queue: queue) {
uLog("完結(jié)咯,刷新UI")
}
}
結(jié)果:無序輸出,最后輸出完結(jié)
網(wǎng)絡(luò)請求進(jìn)階版:
func initData() -> Void {
let group = DispatchGroup()
let queue = DispatchQueue.global()
queue.async(group: group, execute: {
///通知 group,下個任務(wù)要放入 group 中執(zhí)行
group.enter()
///模擬網(wǎng)絡(luò)請求
queue.asyncAfter(deadline: .now() + 4) {
uLog("11111111")
///通知 group,任務(wù)成功完成,要移除,與 enter成對出現(xiàn)
group.leave()
}
})
queue.async(group: group, execute: {
group.enter()
///模擬網(wǎng)絡(luò)請求
queue.asyncAfter(deadline: .now() + 1) {
uLog("222")
group.leave()
}
})
queue.async(group: group, execute: {
group.enter()
///模擬網(wǎng)絡(luò)請求
queue.asyncAfter(deadline: .now() + 6) {
uLog("3333")
group.leave()
}
})
queue.async(group: group, execute: {
group.enter()
///模擬網(wǎng)絡(luò)請求
queue.asyncAfter(deadline: .now() + 10) {
uLog("4444")
group.leave()
}
})
queue.async(group: group, execute: {
group.enter()
uLog("555")
group.leave()
})
///只要任務(wù)全部完成了,就會在最后調(diào)用
group.notify(queue: queue) {
uLog("完結(jié)咯,刷新UI")
}
}
打印結(jié)果:
5,2,1,3,4,完結(jié)
也可用信號量,感覺沒有這樣簡單
信號量
相當(dāng)于一把鎖,信號量為0則阻塞線程,大于0則不會阻塞。則我們通過改變信號量的值,來控制是否阻塞線程,從而達(dá)到線程同步
// 創(chuàng)建一個信號,value:信號量
let semaphore = DispatchSemaphore.init(value: <#T##Int#>)
// 某個信號進(jìn)行等待或等待降低信號量,只有當(dāng)信號量大于0時才會停止等待,繼續(xù)向下執(zhí)行
semaphore.wait()
// 使某個信號的信號量+1
semaphore.signal()
func semaphore_demo() {
let queue = DispatchQueue.global()
//創(chuàng)建信號量 值為1 意思是最大并發(fā)數(shù)為1,任務(wù)只能一個接一個執(zhí)行
let semaphore = DispatchSemaphore.init(value: 1)
//此時信號量為1,無需等待,向下執(zhí)行 信號量 1->0
semaphore.wait()
queue.asyncAfter(deadline: .now() + 4) {
print("1111")
//延遲4秒后輸出1111,釋放信號量,信號量 從0->1
semaphore.signal()
}
//延遲4秒輸出1111后,此時信號量為1,繼續(xù)向下執(zhí)行 同上操作。。。
semaphore.wait()
queue.asyncAfter(deadline: .now() + 10) {
print("2222")
semaphore.signal()
}
semaphore.wait()
queue.asyncAfter(deadline: .now() + 2) {
print("3333")
semaphore.signal()
}
semaphore.wait()
queue.asyncAfter(deadline: .now() + 1) {
print("4444")
semaphore.signal()
}
semaphore.wait()
queue.asyncAfter(deadline: .now() + 6) {
print("5555")
semaphore.signal()
}
semaphore.wait()
print("任務(wù)全部完成")
semaphore.signal()
}
輸出:
1111
2222
3333
4444
5555
任務(wù)全部完成