首页 > 解决方案 > 允许 Alamofire 同步链接相关请求的模式

问题描述

我正在寻找一种在我的应用程序中实现的模式,它允许我干净地让我的应用程序从几个 http 请求中提取信息,其中每个请求需要一个接一个地按顺序运行,并将前一个请求的信息提供给下一个请求。我已经研究了这个问题中的许多解决方案,但是许多答案都是针对旧版本的 Swift,存在冲突的解决方案,有无效的解决方案,并且没有解决从一个请求到下一个请求获取数据的问题。此外,许多想法不会扩展到超过两个请求。

有多个请求不重叠的原因是来自先前请求的数据会馈送到下一个请求中。或者可能是根据数据,跳过一些 http 请求可能是有意义的。

我尝试过嵌套请求,它适用于一层深,但不适用于两层或更多层。它对需要跳过某些请求的逻辑也是不利的。

Alamofire.request(...).responseString { formResponse in
  Alamofire.request(...).responseString { submitResponse in
    Alamofire.request(...).responseString { getDataResponse in 
    // not only is this messy, it also did not proven to wait until all previous threads were done before working on the nested item.
    }
  }
}

我还尝试使用导入的Alamofire-Synchronous包设置串行队列:

let serialQ = DispatchQueue(label: "serialQ")
var info1 = ""
var info2 = ""
var info3 = ""

serialQ.async {
  Alamofire.request(...).responseString { formResponse in
    ....
    info1 = "good stuff"
  }
}

serialQ.async {
  Alamofire.request(...).responseString { submitResponse in 
    ....
    if info1 == "x" {...}
    info2 = "more good stuff"
  }

}

serialQ.async {
  Alamofire.request(...).responseString { getDataResponse in 
    ....
    if info2 == "x" {...}
    info3 = "even more good stuff"
  }
}

上面的代码表现得好像包的同步功能没有做任何事情来阻止 Alamofire 产生并发线程。换句话说,它只是一个接一个地启动所有请求。这可能有效,我没有看到我的代码在哪里实际使用了包中的代码。

我也尝试使用这个 SO answer中提出的想法,但我无法让它发挥作用。事实上,我研究了该问题中的所有答案,但没有一个证明对我有用,或者某些“链接”解决方案没有回答您如何将数据从一个请求提供给下一个请求的问题。

我必须让这件事变得更难!

发出一个 http 请求,等待结果,并在下一个 http 请求(以及下一个,下一个)中使用它,必须有一个优雅的 swift / Alamofire 编程模式。

对这个问题的一个好的回答将允许读者能够使用现代/当前版本的 Swift 和 Alamofire 构建代码,这将链接多个 http 调用,其中前一个请求的响应用于下一个请求。我在示例中使用了 3 个依赖请求,但应该扩展到“n”而不会陷入困境。

标签: swifthttprequestalamofiresynchronous

解决方案


推荐阅读