Наблюдение за событием мыши во ViewModel Swift (Reactive Cocoa 3.0)
Я пытаюсь установить связь между моим представлением и моей моделью представления, используя RAC 3.0. (Я читал замечательные уроки Колина Эберхардта об этом) Я хочу подписаться на Сигнал, который срабатывает каждый раз 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)
}
ViewModel:
signalFromView.producer
|>start { println($0) }
Но это не то, что я хочу, так как использование производителя "вытягивает" значение, то есть при первом запуске этого кода код в viewModel будет запускаться при инициализации с пустым значением, поскольку он пытается извлечь что-то, чего там нет..,
Надеюсь, это имеет смысл.
1 ответ
MutableProperty
s следует использовать больше как свойства, а не как прокси для сигнала. Поэтому его следует инициализировать разумным начальным значением, чтобы любой, кто наблюдает его через producer
получит значения, которые имеют смысл.
Если вы хотите Signal
Вы можете настроить сигнал примерно так:
let (signal, sink) = Signal<String, NoError>.pipe()
В вашей функции mouseUp вы бы отправляли события, используя что-то вроде:
sendNext(sink, someValue)
И вы будете наблюдать, используя:
signal.observe(next: { println($0) })