Почему SignalProducer не возвращает сигнал?

Мне кажется, что я понимаю все основные компоненты ReactiveCocoa (концептуально), понимание того, как соединить все части вместе, все еще немного сбивает с толку.

Например, после прочтения о Signal я полностью ожидал, что у SignalProducer будет только один метод start(), который возвращает Signal, который вы бы использовали следующим образом:

mySignalProducer.start().observe(myObserver)

Вместо этого вам нужно передать наблюдателя в start(), и SignalProducer вызывает для вас функцию наблюдаю ():

mySignalProducer.start(myObserver)

Это означает, что интерфейс SignalProducer намного больше (больше для понимания), потому что все изменения в наблюдении () должны дублироваться при запуске () (например, startNext() и т. Д.).

Я думаю, что здесь есть две возможности:

  1. Существуют технические причины, по которым start() не может просто вернуть сигнал
  2. Концептуально я неправильно понимаю 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
Другие вопросы по тегам