假设我有一个返回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中为RACt,在RAC3中为catch
)。而且我看不出mapError
如何为我们做到这一点?最后,我什至不确定这是否是在RAC3 / RAC4中处理多播的正确方法?任何帮助深表感谢。
最佳答案
在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
也只能启动一次。关于ios - ReactiveCocoa 3和ReactiveCocoa 4中的组播,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/32791696/