ReactiveCocoa:绑定到 Signal 或 SignalProducer 之间的区别?
ReactiveCocoa: Difference between binding to a Signal or a SignalProducer?
绑定运算符(<~)接受一个BindingSource
参数,Signal
和SignalProducer
都符合协议
我希望绑定到生产者的 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
时,在大多数情况下,您应该绑定到 属性 的生产者。
绑定运算符(<~)接受一个BindingSource
参数,Signal
和SignalProducer
都符合协议
我希望绑定到生产者的 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
时,在大多数情况下,您应该绑定到 属性 的生产者。