多個
請求接口不分順序執(zhí)行,都執(zhí)行完畢之后,再刷新界面:
1、隊列組+信號量
gcd的信號量主要有3個函數(shù),分別為
let semaphore = DispatchSemaphore(value: M)
創(chuàng)建一個值為M的信號量
semaphore.wait()
如果該信號量的值大于0,則使其信號量的值-1,
否則,阻塞線程直到該信號量的值大于0。
semaphore.signal()
釋放信號量,使得該信號量的值加1
// 信號量: 使用信號量來阻塞住發(fā)請求的線程
private let semaphore = DispatchSemaphore(value: 0)
let group = DispatchGroup()
DispatchQueue.global().async(group: group, execute: {[weak self] in
// 請求1
xx網(wǎng)絡請求1 {[weak self] (xxxx) in
// do sth
self?.semaphore.signal()
}
self?.semaphore.wait()
})
DispatchQueue.global().async(group: group, execute: {[weak self] in
// 請求2
xx網(wǎng)絡請求2 {[weak self] (xxxx) in
// do sth
self?.semaphore.signal()
}
self?.semaphore.wait()
})
group.notify(queue: DispatchQueue.main) {[weak self] in
// UI refresh
}
2、只隊列組(1)
注意:單純用DispatchQueue.global().async(group: group, execute: {[weak self] in xxx })(不加enter和leave, 不加信號量)實現(xiàn)這種順序,前提是閉包里執(zhí)行的代碼得是同步任務才可以(網(wǎng)絡請求異步不可以)。
private let group = DispatchGroup()
DispatchQueue.global().async(group: group, execute: {[weak self] in
// 請求1
//通知 group,下個任務要放入 group 中執(zhí)行
self?.group.enter()
xx網(wǎng)絡請求1 {[weak self] (xxxx) in
// do sth
// 通知 group,任務成功完成,要移除,與 enter成對出現(xiàn)
self?.group.leave()
}
})
DispatchQueue.global().async(group: group, execute: {[weak self] in
// 請求2
self?.group.enter()
xx網(wǎng)絡請求2 {[weak self] (xxxx) in
// do sth
self?.group.leave()
}
})
group.notify(queue: DispatchQueue.main) {[weak self] in
// UI refresh
}
或者: 只隊列組(2)
private let group = DispatchGroup()
self.group.enter()
DispatchQueue.global().async {[weak self] in
xx網(wǎng)絡請求1 {[weak self] (xxxx) in
// do sth
// 通知 group,任務成功完成,要移除,與 enter成對出現(xiàn)
self?.group.leave()
}
}
self.group.enter()
DispatchQueue.global().async {[weak self] in
xx網(wǎng)絡請求2 {[weak self] (xxxx) in
// do sth
self?.group.leave()
}
}
group.notify(queue: DispatchQueue.main) {[weak self] in
// UI refresh
}