在ViewModel Swift中观察鼠标事件(Reactive Cocoa 3.0)

时间:2015-06-05 15:45:13

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

我正在尝试使用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中的代码将在初始化时使用空值运行,因为它试图拉出不是那里...

希望这是有道理的。

1 个答案:

答案 0 :(得分:1)

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

如果您想要Signal,可以使用以下内容设置信号:

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

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

sendNext(sink, someValue)

你会观察到:

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