7

ReactiveCocoa のすべての基本コンポーネントを (概念的に) 理解しているように感じますが、すべてのピースを接続する方法を理解することは、まだ少し混乱しています。

たとえば、Signal について読んだ後、SignalProducer には Signal を返す start() メソッドが 1 つだけあると完全に予想していましたが、次のように使用します。

mySignalProducer.start().observe(myObserver)

代わりに、オブザーバーを start() に渡す必要があり、SignalProducer が observe() を呼び出します。

mySignalProducer.start(myObserver)

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

ここには2つの可能性があると思います:

  1. start() が単純にシグナルを返せないのには技術的な理由があります
  2. SignalProducer を概念的に誤解しているため、そのインターフェイスに対する不安定な期待につながっています

1 の場合は、まだ完全には理解していないメモリ管理とディスポーザブルに関係していると思います。

2の方が心配です。内部的には、SignalProducer についての私の理解は、基本的に Factory の概念にマッピングされています。

mySignalFactory.createSignal().observe(myObserver)

そのため、Signal を返す start() が見つからないことに驚いています。

コミュニティがここでいくつかの光を当てることができれば、私は非常に感謝しています.

ありがとう!

4

1 に答える 1

7

主な理由は、プロデューサーの起動時にすぐに送信できるイベントがあるためだと思います。

たとえば、開始シリーズ インターフェイスが気に入らず、開始時に直接シグナルを取得したい場合は、次のようにします。

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
于 2016-02-25T03:54:58.050 に答える