7

我觉得我理解了 ReactiveCocoa 的所有基本组件(从概念上),通过理解如何将所有部分连接在一起仍然有点混乱。

例如,在阅读了 Signal 之后,我完全期望 SignalProducer 只有一个返回 Signal 的 start() 方法,您可以像这样使用它:

mySignalProducer.start().observe(myObserver)

相反,您必须将观察者传递给 start(),然后 SignalProducer 会为您调用 observe():

mySignalProducer.start(myObserver)

这意味着 SignalProducer 的接口要大得多(更容易理解),因为 observe() 的所有变体都必须在 start() 上复制(例如 startNext() 等)。

我认为这里有两种可能:

  1. start() 不能简单地返回信号有技术原因
  2. 我在概念上误解了 SignalProducer,导致对其界面的期望不稳

如果 1 是这种情况,我猜这与我还不完全理解的内存管理和一次性用品有关。

我更担心的是2。在内部,我对 SignalProducer 的理解基本上映射到了工厂的概念,例如:

mySignalFactory.createSignal().observe(myObserver)

这就是为什么我很惊讶我们没有找到返回信号的 start()。

如果社区可以在这里提供一些启示,我将不胜感激。

谢谢!

4

1 回答 1

7

我认为主要原因是一些事件可以在生产者启动时立即发送。

比如你不喜欢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
于 2016-02-25T03:54:58.050 回答