假设我有一个返回SignalProducer<AnyObject?, NSError>
的函数,我想将生成器绑定到多个MutableProperty<String>
。所以,像这样:
let foo = SignalProducer<AnyObject?, NSError>(value: nil)
let someProperty1 = MutableProperty<String>("")
let someProperty2 = MutableProperty<String>("")
someProperty1 <~ foo
.flatMapError { _ in
SignalProducer<AnyObject?, NoError>.empty
}
.map { _ in
return "test"
}
// someProperty2 <~ foo etc...
为了避免我的功能(例如某些网络资料)被多次运行,我需要使用多播。据CHANGELOG我所知,startWithSignal
是用于此的运算符。但是,我似乎无法以声明的方式弄清楚如何做到这一点。
因此,一种方法可能是在startWithSignal
:
foo.startWithSignal { signal, disposable in
someProperty1 <~ signal
.map { _ in
return "test"
}
// someProperty2 <~ signal etc...
}
然而,这显然会失败,因为我们需要摆脱NSError
部分。由于我们提供了Signal
(与SignalProducer
相对),因此我们无法使用flatMapError
(在RAC4中,在{RAC3中为catch
)。我不知道mapError
如何为我们做这件事?最后,我甚至不确定这是在RAC3 / RAC4中处理多播的正确方法吗?
非常感谢任何帮助。
答案 0 :(得分:0)
在flatMapError
之前使用SignalProducer
(以及必须采用starWithSignal
参数的任何其他运算符)
let fooIgnoreError = foo
.flatMapError { _ in
SignalProducer<AnyObject?, NoError>.empty
}
fooIgnoreError.startWithSignal { signal, disposable in
someProperty1 <~ signal.map { _ in "test" }
someProperty2 <~ signal.map { _ in "test2" }
}
如果fooIgnoreError
仅启动一次,那么您的基础信号产生者foo
也只能启动一次。
答案 1 :(得分:0)
我解释了如何使用示例here实现多播。
对于错误,您可以让您的媒体资源AnyProperty<Result<Value, Error>>
能够转发错误。如果您希望信号在发生故障时终止,您可以简单地
signal.flatMapError { error in
fatalError("Error: \(error)") // or some other form of error handling, or simply ignoring the error?
return .empty
}