您的评估是 100% 正确的。目前,您提出的两个选项实际上是唯一可能的方法。我同意你的观点,考虑到你的用例,你的第二个选择比第一个选择要好得多。
如果您希望将 ReactiveCocoa 与 Alamofire 结合起来,那么这当然是可能的,但据我所知尚未完成。您还可以调查 PromiseKit 是否能够提供一些帮助,但它还没有与 Alamofire 粘合在一起。无论如何,尝试将这些库与 Alamofire 响应序列化器结合起来都不是一项简单的任务。
换个角度,我真的不认为 ReactiveCocoa 或 PromiseKit 非常适合您的用例,因为您不是链接服务调用,而是并行运行它们。此外,您仍然需要运行所有解析逻辑并确定每个解析逻辑是成功还是失败,然后相应地更新您的应用程序。我的意思是,选项 2 将是迄今为止最好的选择,除非您想尽一切努力将 PromiseKit 或 ReactiveCocoa 与 Alamofire 的响应序列化器相结合。
以下是我的建议,可以让事情变得不那么复杂。
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 风格的方法。
我希望这有助于阐明一些问题。