【问题标题】:Observing mouse event in ViewModel Swift (Reactive Cocoa 3.0)在 ViewModel Swift (Reactive Cocoa 3.0) 中观察鼠标事件
【发布时间】:2015-08-20 15:33:30
【问题描述】:

我正在尝试使用 RAC 3.0 在我的视图和我的 viewModel 之间建立连接。 (一直在阅读 Colin Eberhardt 很棒的 tutorials on this)我想订阅一个每次调用 func mouseUp(theEvent: NSEvent) 时都会触发的信号。即

func mouseUp(theEvent:NSEvent){
  //create some signal or pass a variable here to my viewModel
}

然后我想在我的 viewModel 中订阅该流。

let signalFromview = MutableProperty<String>("")

signalFromView.observe(next: { println($0) })

但我无法让它工作。我设法使它工作的唯一方法是像这样订阅 SignalProducer:

查看:

func mouseUp(theEvent:NSEvent){
    viewModel.signalFromView.put(someValue)
}

视图模型:

signalFromView.producer
|>start { println($0) }

但这不是我想要的,因为使用生产者“拉取”值,即在第一次运行时,viewModel 中的代码将在初始化时以空值运行,因为它试图拉取一些不是那里...

希望这是有道理的。

【问题讨论】:

    标签: swift mvvm reactive-cocoa reactive-cocoa-3


    【解决方案1】:

    MutablePropertys 应该更像属性,而不是作为信号的代理。所以它应该用一个合理的初始值初始化,这样任何通过producer观察它的人都会得到有意义的值。

    如果你想要一个Signal,你可以这样设置信号:

    let (signal, sink) = Signal<String, NoError>.pipe()
    

    在 mouseUp 函数中,您可以使用以下方式发送事件:

    sendNext(sink, someValue)
    

    你会观察到:

    signal.observe(next: { println($0) })
    

    【讨论】:

    • 但是我如何在我的视图模型中观察到这一点,这与我的视图不同?我如何建立这种联系?
    • 我只是展示了一些关于如何使用pipe() 出售的sink/signal 组合的示例。您将根据类的需要将它们作为属性公开和访问。因此,在您的情况下,我实际上会让视图拥有一个出售事件的信号,而视图模型会将 map 它提供给您的字符串表示,并公开一个信号。
    • 谢谢西蒙。我很欣赏你的意见,这一切都是有道理的。但我不知道的是,正如我之前所说,如何在两个类之间建立连接,以便我的 viewModel 可以监听在我的视图中实例化的信号
    • 如果您在两者之间有一个视图控制器,那么它将充当粘合剂。视图将公开事件信号,而视图模型将公开接受事件的观察者(接收器)。 VC 会做signal.observe(vm.sink) 来连接它们,VM 会观察与暴露的接收器相关的信号。
    猜你喜欢
    • 2015-02-06
    • 1970-01-01
    • 1970-01-01
    • 2017-06-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多