目標(biāo):
請(qǐng)求要求串行要達(dá)到順序執(zhí)行,結(jié)果順序返回点楼。先請(qǐng)求先返回。
實(shí)現(xiàn)思路:
使用DispatchQueue 或者DispatchGroup 都可以實(shí)現(xiàn)順序執(zhí)行,但是并沒有做到結(jié)果按照請(qǐng)求的順序順序返回膊夹。
如果你再第二個(gè)接口想要利用第一個(gè)接口返回的數(shù)據(jù),那單獨(dú)使用隊(duì)列或者隊(duì)列組是達(dá)不到了捌浩。還需要結(jié)合信號(hào)量放刨。
信號(hào)量簡(jiǎn)介
dispatch_semaphore_create(M)// 創(chuàng)建一個(gè)值為M的信號(hào)量
dispatch_semaphore_wait(信號(hào)量,等待時(shí)間)//如果該信號(hào)量的值大于0尸饺,則使其信號(hào)量的值-1进统,否則,阻塞線程直到該信號(hào)量的值大于0或者達(dá)到等待時(shí)間浪听。
dispatch_semaphore_signal(信號(hào)量)//釋放信號(hào)量螟碎,使得該信號(hào)量的值加1
代碼實(shí)例
func dispatchSemaphore () {
let group = DispatchGroup()
let serialQueue = DispatchQueue(label: "request_queue")
group.enter() // 開始
serialQueue.async {
let sema = DispatchSemaphore(value: 0)
self.requestO(sema: sema)
print("11")
sema.wait() // 等待任務(wù)結(jié)束, 否則一直阻塞
group.leave() // 結(jié)束
}
group.enter() // 開始
serialQueue.async {
let sema = DispatchSemaphore(value: 0)
print("12")
self.requestT(sema: sema)
sema.wait() // 等待任務(wù)結(jié)束, 否則一直阻塞
group.leave() // 結(jié)束
}
group.notify(queue: DispatchQueue.main) {
// 全部調(diào)用完成后回到主線程,更新UI
}
// 讓信號(hào)量 +1, 當(dāng)>0時(shí)就代表綠燈可以走了
}
fileprivate func requestO(sema: DispatchSemaphore) {
print("1")
sema.signal()
}
fileprivate func requestT(sema: DispatchSemaphore) {
print("2")
sema.signal()
}