我需要在视图控制器中调用2个apis来从服务器获取一些数据,我希望它们同时启动,但只有在返回它们时才会触发下一步(无关紧要)成功或失败)。 我可以提出两个解决方案: 把它们连在一起。调用api1,在api1的结果处理程序中调用api2,等待api2的结果 2.设置2个Bool指标变量,创建一个检查功能,如果这两个指标都为真,则执行下一步。在两个Apis结果处理程序中,设置相应的指示符变量,然后调用check函数来决定是否好转
第一个还不够,我不能说第二个是优雅的解决方案。 Alamofire有没有Reactivecocoa中的组合信号?或者更好的解决方案?
答案 0 :(得分:8)
您的评估是100%正确的。目前,您提出的两个选项实际上是唯一可行的方法。我同意你的看法,你的第二个选择比第一个用例要好得多。
如果您希望将ReactiveCocoa与Alamofire结合使用,那么这当然是可能的,但据我所知还没有完成。您还可以调查PromiseKit是否能够提供一些帮助,但它还没有与Alamofire粘在一起。尝试将这些库中的任何一个与Alamofire响应序列化器结合起来,无论如何都不是一项微不足道的任务。
稍微切换一下,我真的不认为ReactiveCocoa或PromiseKit非常适合您的用例,因为您没有链接服务调用,而是并行运行它们。此外,您仍然需要运行所有解析逻辑并确定每个解析逻辑是成功还是失败,然后相应地更新您的应用程序。我所得到的是,除非你想将PromiseKit或ReactiveCocoa与Alamofire的响应序列化器结合起来,否则选项2将是你最好的选择。
这是我建议的事情,以减少事情的复杂性。
import Foundation
import Alamofire
class ParallelServiceCaller {
var firstServiceCallComplete = false
var secondServiceCallComplete = false
func startServiceCalls() {
let firstRequest = Alamofire.request(.GET, "http://httpbin.org/get", parameters: ["first": "request"])
firstRequest.responseString { request, response, dataString, error in
self.firstServiceCallComplete = true
self.handleServiceCallCompletion()
}
let secondRequest = Alamofire.request(.GET, "http://httpbin.org/get", parameters: ["second": "request"])
secondRequest.responseString { request, response, dataString, error in
self.secondServiceCallComplete = true
self.handleServiceCallCompletion()
}
}
private func handleServiceCallCompletion() {
if self.firstServiceCallComplete && self.secondServiceCallComplete {
// Handle the fact that you're finished
}
}
}
实施非常简洁,易于理解。虽然我理解你想要摆脱完成标志和回调函数,但其他选项如ReactiveCocoa和/或PromiseKit仍然会有额外的逻辑,最终可能会使事情变得更复杂。
另一种可能的选择是使用调度组和信号量,但这确实增加了复杂性,但可以使您更接近ReactiveCocoa或PromiseKit样式方法。
我希望这有助于解决问题。
答案 1 :(得分:0)
init
是并行处理多个相关请求的好选择
DispatchGroup