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

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

在开发过程中,偶尔会遇到这样的一个需求,一个页面里面显示需要请求多个接口,每个接口的的请求是有循序的,必须要等A接口回来,在去请求B接口,然后A,B接口的数据回来在刷新数据,之前在拿货做项目的时候遇到过这样的需求,后来做库克音乐也遇到这样的需求.下面我把思路说一下.很简单的. 对于swift4.2的网络请求的封装。包含链式,类AFN及对moya的封装。封装的功能包含:1.一次性处理请求指示器HUD 2.一次性处理请求状态码及错误弹窗 3.登录过期自动跳转到登录页等。 4.可以处理所有接口都要使用的公共参数。 现实的iOS开发中,经常会遇到一个控制器有多个网络请求的情况,而这些网络请求我们又需要控制一下返回的先后顺序。比如说请求任务一成功以后,需要拿到任务一的数据请求任务二,再拿到任务二请求数据请求任务三,此时,就需要控制一下网络请求的返回顺序。经过查找资料,我现在采用添加队列任务的方式来实现。代码如下import UIKitclass ViewController: UIViewControll... 相关文章系列:(文章代码均已升级至Swift3) [当前文章] Swift - HTTP网络操作库Alamofire使用详解1(配置,以及数据请求Swift - HTTP网络操作库Alamofire使用详解2(文件上传) Swift - HTTP网络 let queue = DispatchQueue(label: "xibei.manong.queueName",qos: .default) queue.sync { for i in 0...