ReactiveCocoa: разница между привязкой к Сигналу или Производителю Сигнала?
Оператор связывания (<~) принимает BindingSource
аргумент, оба Signal
а также SignalProducer
соответствовать протоколу
Я ожидал бы, что элемент пользовательского интерфейса, связанный с производителем, не будет "получать события", пока производитель не будет каким-либо образом запущен, но, похоже, это не так
т.е.
let text = MutableProperty("abc")
myLabel1.reactive.text <~ text.signal
myLabel2.reactive.text <~ text.producer
text.value = "def"
вызывает обновление обеих меток.
Это предполагаемое поведение или я что-то неправильно понимаю?
2 ответа
Это намеренное поведение. Вы можете увидеть в реализации<~
тот start
вызывается явно (и распоряжение производителя связано с временем жизни цели привязки).
[РЕДАКТИРОВАТЬ]
Чтобы уточнить, не имеет смысла привязывать самого продюсера к лейблу так, как вы себе представляете. Что будет, если start
был вызван несколько раз, чтобы произвести несколько сигналов? Получит ли метка значения из первого сигнала, самого последнего сигнала или всех сигналов, объединенных вместе? Там нет интуитивно понятного способа, чтобы это работало.
Производитель запускается сразу, когда вы вызываете оператор привязки <~
,
Основное различие между привязкой к 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
В большинстве случаев вы должны связать с производителем имущества.