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

时间:2017-05-24 18:14:24

标签: reactive-cocoa reactive-swift reactive-cocoa-5

绑定运算符(<〜)采用BindingSource参数,SignalSignalProducer符合协议

我希望绑定到生产者的UI元素在生成器以某种方式启动之前不会“接收事件”,但似乎并非如此

let text = MutableProperty("abc")

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

text.value = "def"

导致两个标签都更新。

这是预期的行为,还是我误解了什么?

2 个答案:

答案 0 :(得分:2)

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

<强> [编辑]

为了澄清,将制作者本身以您想象的方式绑定到标签没有多大意义。如果start被多次调用以产生多个信号,会发生什么?标签是否会从第一个信号,最近的信号或所有信号合并在一起得到值?没有直观的方法可以解决这个问题。

答案 1 :(得分:0)

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

绑定到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时,在大多数情况下,您应该绑定到属性的生产者。