【发布时间】:2017-06-05 10:30:14
【问题描述】:
我有一个关于 Swift 3 的 ReactiveCocoa (v5) 的问题。在我的项目中,我有不同的服务。例如 api 或用于从磁盘保存或获取内容。这些服务正在返回 SignalProducer。我现在有一些类似调用不同服务的序列,这些服务相互依赖。这里的顺序:
- 调用服务获取密钥
- 使用key调用服务的api
- 从api获取数据(返回多个模型)
- 使用 first-model-service 保存第一个模型
- 使用 second-model-service 保存第二个模型
在我的序列中,我还必须将来自第二个服务调用的数据传递给模型保存。
keyService.get().flatMap(.latest) { (key) -> SignalProducer<[Data],Error> in
return self.dataService.get()(key: key)
}
.flatMap(.latest) { (data) -> SignalProducer<Bool, Error> in
return self.firstModelService.save(data["Model1"])
}
.flatMap(.latest) { (data) -> SignalProducer<Bool, Error> in
//how to get data here?
return self.secondModelService.save(data["Model2"])
}.startWithFailed({ e in
})
此外,如果序列中的SignalProducer 之一正在发送一个错误,那么整个序列将停止,并以错误作为参数调用回调。我不知道startWithFailed是不是这里的正确函数。
有没有人和我一样的情况,可以举个例子吗?我阅读了一些教程,但我无法弄清楚。
【问题讨论】:
-
它没有按预期工作吗?乍一看,我觉得它很好,
startWithFailed也应该是正确的运算符。如果任何一个 SignalProducers 发送错误,则该错误应通过整个链传播到startWithFailed观察者。 -
是的,如果您只关心处理失败案例而对成功无事可做,这对我来说是正确的。
-
好吧,还有另一件事。你看到最后一个 flatMap 中的评论了吗?如何从那里的 api 请求中获取数据?
-
我对这里的类型有些混淆。第一个
flatMap中的data应该是Data值的数组,还是应该被展平为单独的Data值?如果您只想将data传递给下一个flatMap,请使用map:return self.firstModelService.save(data["Model1"]).map { _ in data }(您必须更新您的类型注释)。
标签: swift swift3 reactive-programming reactive-cocoa reactive-swift