我怎么映射这个
func save() -> SignalProducer<Void, NetworkError>
到
var saveAction: Action<AnyObject, Bool, NoError>
我对语法有点困惑
service.save()
.observeOn(QueueScheduler.mainQueueScheduler)
.map<Bool>( _ in true) // how to map void to bool
.flatMapError {
error in
// how to map to a NoError?
}
此外,使用 Action 的最佳实践应该是什么? NetworkError 是否应该冒泡到 Controller ,以便它可以在弹出对话框中显示错误?
最佳答案
你问了 3 件事,让我们一一说:
- Going from a
Void
toBool
假设您有一个 foo: SignalProducer<Void, Error>
:
let bar: SignalProducer<Bool, Error> = foo.map { _ in true}
- Going from a
NetworkError
to aNoError
这不直观,但您可以利用 Swift 的类型推断并执行如下操作:
let bar: SignalProducer<Void, NoError> = foo.flatMapError { _ in SignalProducer.empty }
你的 func save() -> SignalProducer<Void, NetworkError>
然后可以变成:
let save: SignalProducer<Void, NetworkError> = ...
let newSave: SignalProducer<Bool, NoError> = save.map {_ in true}.flatMapError { _ in SignalProducer.empty }
- should the NetworkError bubble up to the controller so it can display the error in a Popup dialog?
最终您必须将错误转换为可读的内容。 Controller (假设我们正在谈论 UIViewController
)可以利用辅助实体将此错误转换为一个字符串或一对字符串(标题 + 正文)。如果您使用的是 MVVM,即 ViewModel,是否会进行这种转换。
关于ios - 如何在 SignalProducer 上映射值和错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36159216/