假设我有一个返回 SignalProducer<AnyObject?, NSError>
的函数我想将生产者绑定(bind)到多个 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
的闭包中进行绑定(bind):
foo.startWithSignal { signal, disposable in
someProperty1 <~ signal
.map { _ in
return "test"
}
// someProperty2 <~ signal etc...
}
但是这显然会失败,因为我们需要摆脱 NSError
部分。因为我们给出了 Signal
(与 SignalProducer
相对),我们不能使用 flatMapError
(在 RAC4 中,catch
在 RAC3 中)。我看不出如何mapError
可以为我们做这个吗?最后,我什至不确定这是在 RAC3/RAC4 中处理多播的正确方法吗?
非常感谢任何帮助。
最佳答案
在 starWithSignal
之前使用 flatMapError
(以及任何其他必须采用 SignalProducer
参数的运算符)
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
也保证仅启动一次。
关于ios - ReactiveCocoa 3 和 ReactiveCocoa 4 中的多播,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32791696/