绑定运算符(<〜)采用BindingSource
参数,Signal
和SignalProducer
符合协议
我希望绑定到生产者的UI元素在生成器以某种方式启动之前不会“接收事件”,但似乎并非如此
即
let text = MutableProperty("abc")
myLabel1.reactive.text <~ text.signal
myLabel2.reactive.text <~ text.producer
text.value = "def"
导致两个标签都更新。
这是预期的行为,还是我误解了什么?
答案 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
时,在大多数情况下,您应该绑定到属性的生产者。