Swift GCD之多网络请求串行,使用请求数据进行下一个网络请求

前言:按照我的理解,串行要达到顺序执行,结果顺序返回。先请求先返回。

如果你单单使用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()
}
}


你可能感兴趣的:(Swift GCD之多网络请求串行,使用请求数据进行下一个网络请求)