ReactiveCocoa:绑定到 Signal 或 SignalProducer 之间的区别?

ReactiveCocoa: Difference between binding to a Signal or a SignalProducer?

绑定运算符(<~)接受一个BindingSource参数,SignalSignalProducer都符合协议

我希望绑定到生产者的 UI 元素不会 "receive events" 直到生产者以某种方式启动,但情况似乎并非如此

let text = MutableProperty("abc")

myLabel1.reactive.text <~ text.signal
myLabel2.reactive.text <~ text.producer

text.value = "def"

导致两个标签都更新。

这是故意的行为还是我误解了什么?

这是有意为之的行为。您可以看到 in the implementation of <~ start 被显式调用(生产者的处置与绑定目标的生命周期相关)。

[编辑]

澄清一下,按照您想象的方式将生产者本身绑定到标签上没有多大意义。如果 start 被多次调用以产生多个信号会发生什么?标签会从第一个信号、最近的信号或合并在一起的所有信号中获取值吗?没有直观的方法可以做到这一点。

生产者在您调用绑定运算符时立即启动 <~

绑定到 Signal 和绑定到 SignalProducer 之间的主要区别在于 SignalProducer 可以在启动时立即发送值。

删除示例的最后一行,您可以看到不同之处:

myLabel1.text = ""
myLabel2.text = ""

let text = MutableProperty("abc")

myLabel1.reactive.text <~ text.signal // no change
myLabel2.reactive.text <~ text.producer // changed to "abc"

因为 text.producer 在您启动它时立即发送其当前值 "abc",而 text.signal 仅发送新更新的值。

因此,当您绑定到 MutableProperty 时,在大多数情况下,您应该绑定到 属性 的生产者。