0

我使用单个串行队列作为根队列/请求/序列化队列

let queue = DispatchQueue(label: "APIManager.rootQueue")
a.session = Session(configuration: sessionConfiguration,
                    delegate: a,
                    rootQueue: queue,
                    startRequestsImmediately: true,
                    requestQueue: queue,
                    serializationQueue: queue,
                    interceptor: nil,
                    serverTrustManager: nil,
                    redirectHandler: nil,
                    cachedResponseHandler: nil,
                    eventMonitors: [])

但是,这些请求似乎是按照创建顺序的随机顺序完成的

完成打印到控制台:

[2][Request]: GET https://...
[1][Request]: GET https://...
[4][Request]: GET https://...
[3][Request]: GET https://...
[5][Request]: GET https://...

[]中的数字代表创建顺序 PS:序列化的时候顺序也是错误的

队列是串行的,但结果看起来像并发的

如何维护请求和结果的 FIFO 顺序

4

1 回答 1

0

如果您想按顺序而不是并行发出请求,您可以:

  1. 嵌套它们。在前一个请求的完成处理程序中启动下一个请求。
  2. 将 Alamofire 请求包装在Operations 中并设置操作之间的依赖关系,以便它们按照您想要的顺序执行。
  3. 使用 Alamofire 的 Combine 集成来发布第一个请求的响应,然后flatMap在下一个请求中。
  4. 使用 Swift 的新并发特性来包装 Alamofire 的完成处理程序,以便您可以使用async-await语法。这将在即将发布的版本中由 Alamofire 直接支持。

最终,您可能想要重新评估 FIFO 是否是您真正想要的,或者您是否可以构建一个不在乎请求何时完成的系统。这样的系统可能更容易管理,因为您消除了请求之间的依赖关系,并且性能更高,因为您消除了确保请求按正确顺序所需的任何等待。

于 2021-11-16T03:39:00.353 回答