为什么 SignalProducer return 不是 Signal?
Why doesn't SignalProducer return a Signal?
我觉得我理解了 ReactiveCocoa 的所有基本组件(概念上),通过理解如何将所有部分连接在一起仍然有点混乱。
例如,在阅读了 Signal 之后,我完全希望 SignalProducer 只有一个 start() 方法,该方法 returned 一个 Signal,您可以像这样使用它:
mySignalProducer.start().observe(myObserver)
相反,您必须将观察者传递给 start(),SignalProducer 会为您调用 observe():
mySignalProducer.start(myObserver)
这意味着 SignalProducer 的接口要大得多(更容易理解),因为 observe() 上的所有变体都必须在 start() 上复制(例如 startNext() 等)。
这里我觉得有两种可能:
- start() 不能简单地 return 一个 Signal
是有技术原因的
- 我在概念上误解了 SignalProducer,导致对其界面的期望不可靠
如果 1 是这种情况,我猜这与我还不完全理解的内存管理和一次性用品有关。
我比较担心2是这样的。在内部,我对 SignalProducer 的理解基本上映射到工厂的概念,例如:
mySignalFactory.createSignal().observe(myObserver)
这就是为什么我很惊讶我们没有找到一个 return 是信号的 start()。
如果社区能在这里阐明一些问题,我将不胜感激。
谢谢!
我觉得主要是有些事件可以在producer启动的时候立即发送
比如你不喜欢start系列的界面,想在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
我觉得我理解了 ReactiveCocoa 的所有基本组件(概念上),通过理解如何将所有部分连接在一起仍然有点混乱。
例如,在阅读了 Signal 之后,我完全希望 SignalProducer 只有一个 start() 方法,该方法 returned 一个 Signal,您可以像这样使用它:
mySignalProducer.start().observe(myObserver)
相反,您必须将观察者传递给 start(),SignalProducer 会为您调用 observe():
mySignalProducer.start(myObserver)
这意味着 SignalProducer 的接口要大得多(更容易理解),因为 observe() 上的所有变体都必须在 start() 上复制(例如 startNext() 等)。
这里我觉得有两种可能:
- start() 不能简单地 return 一个 Signal 是有技术原因的
- 我在概念上误解了 SignalProducer,导致对其界面的期望不可靠
如果 1 是这种情况,我猜这与我还不完全理解的内存管理和一次性用品有关。
我比较担心2是这样的。在内部,我对 SignalProducer 的理解基本上映射到工厂的概念,例如:
mySignalFactory.createSignal().observe(myObserver)
这就是为什么我很惊讶我们没有找到一个 return 是信号的 start()。
如果社区能在这里阐明一些问题,我将不胜感激。
谢谢!
我觉得主要是有些事件可以在producer启动的时候立即发送
比如你不喜欢start系列的界面,想在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