2016-02-25 2 views
5

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

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

mySignalProducer.start().observe(myObserver) 

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

mySignalProducer.start(myObserver) 

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

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

  1. Есть технические причины начать() не может просто вернуть сигнал
  2. я неправильно понимают SignalProducer концептуально, что приводит к шаткий ожиданиям его интерфейса

Если это так, я предполагаю, что это имеет какое-то отношение к управлению памятью и расходными материалами, которые я еще не совсем понял.

Я больше обеспокоен тем, что это случай. Внутренне, мое понимание SignalProducer в основном отображается на концепцию завода, например .:

mySignalFactory.createSignal().observe(myObserver) 

поэтому я удивлен, что мы не находим начало(), который возвращает сигнал.

Я был бы очень благодарен, если бы сообщество могло пролить свет здесь.

Спасибо!

ответ

5

Я думаю, что основная причина заключается в том, что некоторые события могут быть отправлены сразу же после запуска производителя.

Например, если вам не нравится интерфейс запуска серии, и хотите получить сигнал непосредственно при запуске:

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