Почему SignalProducer не возвращает сигнал?
Мне кажется, что я понимаю все основные компоненты ReactiveCocoa (концептуально), понимание того, как соединить все части вместе, все еще немного сбивает с толку.
Например, после прочтения о Signal я полностью ожидал, что у SignalProducer будет только один метод start(), который возвращает Signal, который вы бы использовали следующим образом:
mySignalProducer.start().observe(myObserver)
Вместо этого вам нужно передать наблюдателя в start(), и SignalProducer вызывает для вас функцию наблюдаю ():
mySignalProducer.start(myObserver)
Это означает, что интерфейс SignalProducer намного больше (больше для понимания), потому что все изменения в наблюдении () должны дублироваться при запуске () (например, startNext() и т. Д.).
Я думаю, что здесь есть две возможности:
- Существуют технические причины, по которым start() не может просто вернуть сигнал
- Концептуально я неправильно понимаю SignalProducer, что приводит к сомнительным ожиданиям в отношении его интерфейса.
Если 1 имеет место, я предполагаю, что это как-то связано с управлением памятью и расходными материалами, которые я до конца не понимаю.
Я больше волнуюсь, что 2 имеет место. Внутренне мое понимание SignalProducer в основном соответствует концепции фабрики, например:
mySignalFactory.createSignal().observe(myObserver)
вот почему я удивлен, что мы не находим start(), который возвращает сигнал.
Я был бы чрезвычайно признателен, если бы сообщество могло пролить немного света здесь.
Спасибо!
1 ответ
Я думаю, что основная причина в том, что некоторые события могут быть отправлены сразу после запуска продюсера.
Например, если вам не нравится интерфейс стартовой серии, и вы хотите получить сигнал непосредственно при запуске:
extension SignalProducer {
func getSignalFromStart() -> Signal<Value, Error> {
var signal: Signal<Value, Error>!
startWithSignal{ innerSignal, _ in
signal = innerSignal
}
return signal
}
}
Тогда вы можете пропустить некоторые события. Попробуй это:
// When property.producer starts, it will send its current value immediately
let property = MutableProperty(1)
property.producer.getSignalFromStart().observeValues { value in
print("getSignalFromStart \(value)") // maybe not what you want, only gets 2
}
property.producer.startWithValues { value in
print("normal start \(value)") // this normally gets 1 and 2
}
property.value = 2