2016-02-25 14 views
5

ReactiveCocoaのすべての基本コンポーネント(概念的に)を理解しているように感じます。例えばSignalProducerがシグナルを返さないのはなぜですか?

は、信号に関する読んだ後、私は完全にSignalProducerはちょうどあなたがそうのように使用する信号を返された1 start()メソッドを、持っていると予想:

代わり
mySignalProducer.start().observe(myObserver) 

、あなたは合格する必要がありますスタートへのオブザーバー()、およびSignalProducer呼び出しは()あなたのための観察:

mySignalProducer.start(myObserver) 

これは、観測上のバリエーションのすべてが()する必要があるためSignalProducerのインタフェースは、(より理解するために)非常に大きいことを意味しますstart()(例えばstartNext()など)に複製されます。

は、私はここで二つの可能性があると思う:

  1. 理由(起動技術的な理由がありますが)単に私がそのインターフェース
  2. のグラグラの期待につながる、概念的SignalProducerを誤解信号
  3. を返すことはできません。

1が当てはまるとすれば、それは私がまだ完全に理解していないメモリ管理と使い捨てと関係があると推測しています。

私は2が大事だと心配しています。内部的には、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 
関連する問題