【问题标题】:ReactiveCocoa: Difference between binding to a Signal or a SignalProducer?ReactiveCocoa:绑定到 Signal 或 SignalProducer 之间的区别?
【发布时间】:2017-05-24 18:14:24
【问题描述】:

绑定运算符 (BindingSource 参数,SignalSignalProducer 都符合协议

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

let text = MutableProperty("abc")

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

text.value = "def"

使两个标签都更新。

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

【问题讨论】:

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


    【解决方案1】:

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

    [编辑]

    为了澄清,以您想象的方式将生产者本身绑定到标签没有多大意义。如果多次调用start 以产生多个信号会怎样?标签会从第一个信号、最近的信号还是合并在一起的所有信号中获取值?没有直观的方法可以做到这一点。

    【讨论】:

    • 由于您提供的原因,SignalProducer 似乎不应该是有效的绑定目标?开始被隐式调用(从用户的 POV 开始)违背了为什么首先区分信号和生产者不是?
    • 我可以看到混乱,但另一方面,&lt;~ 并不是唯一隐式启动生产者的函数。 flatMap 是一个非常常见的运算符,它的作用相同。 Reactive-Swift 文档中的 This example 使用 flatMap 隐式启动生产者,即使在任何地方都看不到 start* 函数。
    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-08-19
      • 2015-09-02
      • 2012-11-20
      • 2017-01-20
      • 2016-02-29
      相关资源
      最近更新 更多