如何在Alamofire中处理多个网络呼叫

时间:2015-03-01 07:54:31

标签: swift alamofire

我需要在视图控制器中调用2个apis来从服务器获取一些数据,我希望它们同时启动,但只有在返回它们时才会触发下一步(无关紧要)成功或失败)。 我可以提出两个解决方案: 把它们连在一起。调用api1,在api1的结果处理程序中调用api2,等待api2的结果 2.设置2个Bool指标变量,创建一个检查功能,如果这两个指标都为真,则执行下一步。在两个Apis结果处理程序中,设置相应的指示符变量,然后调用check函数来决定是否好转

第一个还不够,我不能说第二个是优雅的解决方案。 Alamofire有没有Reactivecocoa中的组合信号?或者更好的解决方案?

2 个答案:

答案 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