我正在寻找在我的应用程序中实现的模式,这将允许我干净地让我的应用程序从几个http请求中提取信息,其中每个请求需要依次顺序运行,并从中提供信息前者请求下一个请求。我已经完成了this question中的许多解决方案,但许多答案都是针对Swift的旧版本,存在冲突的解决方案,存在非工作解决方案,并且 none解决了从一个请求获取数据的问题到下一个请求。此外,许多想法不会扩展到超过两个请求。
多个请求不重叠的原因是来自先前请求的数据会进入下一个请求。或者可能是这取决于数据,跳过一些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产生并发线程。换句话说,它只是一个接一个地完成所有请求。这可能有用,我没有看到我的代码实际使用了包中的代码。
我也尝试使用this SO answer中提出的想法,但我无法让它发挥作用。事实上,我已经完成了那个问题的所有答案,并且没有一个证明适用于我或某些"链接"解决方案没有回答如何将数据从一个请求提供给下一个请求的问题。
我必须让它变得比以前更难!
发出http请求,等待结果,并在下一个http请求中使用它(以及下一个和下一个),必须有一个优雅的swift / Alamofire编程模式。
这个问题的一个很好的答案将使读者能够使用现代/当前版本的Swift和Alamofire构建代码,这将链接几个http调用,其中来自前一个请求的响应在下一个请求中使用。我在我的示例中使用了3个相关请求,但应扩展到" n"没有陷入困境。