我觉得我(从概念上)理解了ReactiveCocoa的所有基本组成部分,通过了解如何将所有部分连接在一起仍然有点令人困惑。
例如,在阅读了有关Signal的内容之后,我完全希望SignalProducer仅具有一个start()方法,该方法返回了Signal,您可以这样使用它:
mySignalProducer.start().observe(myObserver)
相反,您必须将观察者传递给start(),SignalProducer会为您调用observe():
mySignalProducer.start(myObserver)
这意味着SignalProducer的接口要大得多(需要更多理解),因为observe()的所有变体都必须在start()上复制(例如,startNext()等)。
我认为这里有两种可能性:
如果是1,我想这与我尚不完全了解的内存管理和一次性设备有关。
我更担心2的情况。在内部,我对SignalProducer的理解基本上映射到Factory的概念,例如:
mySignalFactory.createSignal().observe(myObserver)
这就是为什么我很惊讶我们找不到返回信号的start()的原因。
如果社区能够在这里阐明一些观点,我将非常感激。
谢谢!
我认为主要原因是某些事件可以在生产者启动时立即发送。
例如,如果您不喜欢启动系列界面,并希望在启动时直接获得信号:
extension SignalProducer {
func getSignalFromStart() -> Signal<Value, Error> {
var signal: Signal<Value, Error>!
startWithSignal{ innerSignal, _ in
signal = innerSignal
}
return signal
}
}
然后,您可以错过一些活动。试试这个:
// When property.producer starts, it will send its current value immediately
let property = MutableProperty(1)
property.producer.getSignalFromStart().observeValues { value in
print("getSignalFromStart \(value)") // maybe not what you want, only gets 2
}
property.producer.startWithValues { value in
print("normal start \(value)") // this normally gets 1 and 2
}
property.value = 2
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句