前言:按照我的理解,串行要达到顺序执行,结果顺序返回。先请求先返回。
如果你单单使用DispatchQueue 或者DispatchGroup 都可以实现顺序执行,但是并没有做到结果按照请求的顺序顺序返回。
如果你再第二个接口想要利用第一个接口返回的数据,那单独使用队列或者队列组是达不到了。还需要结合信号量。
简单介绍下:信号量的使用
// 创建初始值为0的信号量,这时代表是红灯
let semaphore = DispatchSemaphore(value: 0)
// 让信号量 -1,比如默认值时0, wait()以后就变成了 -1了,因此会等待
semaphore.wait()
// 让信号量 +1, 当>0时就代表绿灯可以走了
semaphore.signal()
使用例子:
let group = DispatchGroup()
let serialQueue = DispatchQueue(label: "request_queue")
group.enter() // 开始
serialQueue.async {
let sema = DispatchSemaphore(value: 0)
self.request2(sema: sema)
sema.wait() // 等待任务结束, 否则一直阻塞
group.leave() // 结束
}
group.enter() // 开始
serialQueue.async {
let sema = DispatchSemaphore(value: 0)
self.request2(sema: sema)
sema.wait() // 等待任务结束, 否则一直阻塞
group.leave() // 结束
}
group.notify(queue: DispatchQueue.main) {
// 全部调用完成后回到主线程,更新UI
}
在请求的成功或失败的回调里需要把信号量+1,让其继续执行
fileprivate func request1(sema: DispatchSemaphore) {
xxx(success: { (result) in
// 信号量+1
sema.signal()
}) { (error) in
// 失败的时候也要+1, 否则会永远阻塞了
sema.signal()
}
}
fileprivate func request2(sema: DispatchSemaphore) {
xxx(success: { (result) in
// 信号量+1
sema.signal()
}) { (error) in
// 失败的时候也要+1, 否则会永远阻塞了
sema.signal()
}
}