绑定运算符 (<~( 采用BindingSource
参数,Signal
和SignalProducer
都符合协议
我希望绑定到生产者的 UI 元素不会"接收事件",直到以某种方式启动生产者,但情况似乎并非如此
即
let text = MutableProperty("abc")
myLabel1.reactive.text <~ text.signal
myLabel2.reactive.text <~ text.producer
text.value = "def"
导致两个标签更新。
这是有意的行为还是我误解了什么?
预期行为。在<~
的实现中可以看到显式调用start
(并且生成者的处置与绑定目标的生存期相关联(。
[编辑]
澄清一下,以你想象的方式将生产者本身绑定到标签上没有多大意义。如果多次调用start
以产生多个信号会发生什么?标签是从第一个信号、最新信号还是所有信号合并在一起获取值?没有直观的方法可以做到这一点。
当您调用绑定运算符 <~
时,生产者会立即启动。
绑定到信号和信号生产者之间的主要区别在于,信号生产者可以在启动时立即发送值。
删除示例的最后一行,您可以看到差异:
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
时,在大多数情况下,您应该绑定到属性的生产者。