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В большинстве случаев вы должны связать с производителем имущества.

Другие вопросы по тегам