2017-02-15 4 views
2

Я использую Swift, ReactiveSwift и ReactiveCocoa.Как связать один SignalProducer с несколькими компонентами пользовательского интерфейса?

Предполагая, что у меня есть один SignalProducer, существует ли способ для обновления нескольких компонентов пользовательского интерфейса при создании Event?

например.

let sp = SignalProducer<Int, NoError> = // ... 
label1.reactive.text <~ sp.map { String($0) } 
label2.reactive.text <~ sp.map { "You entered \(String($0)) } 

Проблема, которую я в настоящее время сталкиваются в том, что SignalProducer запускается, как только я использую оператор <~. Таким образом, продюсер вызывается дважды. Это нежелательно, если производитель является, скажем, сетевым запросом.

ответ

4

У вас может быть отдельный MutableProperty, связанный с SignalProducer, и эти две метки привязаны к этому MutableProperty. Если вы не хотите 0, чтобы показать, вы могли бы сделать MutableProperty провести дополнительный Int

let sp = SignalProducer<Int, NoError> = // ... 
let result = MutableProperty(0) 
label1.reactive.text <~ result.map { String($0) } 
label2.reactive.text <~ result.map { "You entered \(String($0)) } 
result <~ sp 
+0

Спасибо - это сработало отлично! – sdasdadas

1

Я знаю, что это старый и уже ответил, но альтернативой использованию недвижимости является использование startWithSignal:

let sp: SignalProducer<Int, NoError> = // ... 
sp.startWithSignal { (signal, _) in 
    label1.reactive.text <~ signal.map { String($0) } 
    label2.reactive.text <~ signal.map { "You entered \(String($0)) } 
} 
+0

Спасибо! Это тоже полезно! – sdasdadas