2017-05-24 4 views
0

結合演算子(<〜)は、両方のSignalSignalProducer私はプロデューサーが開始されるまで、「イベントを受け取る」ではないでしょうプロデューサーにバインドされたUI要素を期待するプロトコルReactiveCocoa:SignalまたはSignalProducerとのバインディングの違いは?

に準拠し、BindingSource引数を取ります何らかの方法で、これは

すなわち

let text = MutableProperty("abc") 

myLabel1.reactive.text <~ text.signal 
myLabel2.reactive.text <~ text.producer 

text.value = "def" 

は、両方のラベルが更新しますケースであるとは思えません。

これは意図した動作ですか、何かを誤解していますか?

答えて

1

これは意図した動作です。 in the implementation of <~は、startが明示的に呼び出されます(プロデューサの廃棄はバインディングターゲットの存続期間に関連付けられています)。

[EDIT]

明確にするために、それはあなたが想像しているように、ラベルにプロデューサー自体をバインドするためにあまり意味がありません。 startを複数回呼び出して複数の信号を生成するとどうなりますか?ラベルは、最初の信号、最新の信号、またはすべての信号が一緒にマージされた値を取得しますか?そのために直感的な方法はありません。

+0

あなたが提供した理由から、SignalProducerは有効なバインディングターゲットではないようですね。暗黙のうちに(ユーザーのPOVから)呼び出されることを開始することは、なぜシグナルとプロデューサが最初のどこで差別化されているのかに反していますか? – synndicate

+0

私は混乱を見ることができますが、他方では、 '<〜'は暗黙的にプロデューサを開始する唯一の関数ではありません。 'flatMap'は同じことをする極めて一般的な演算子です。 Reactive-Swiftドキュメントの[この例](https://github.com/ReactiveCocoa/ReactiveSwift/blob/master/Documentation/Example.OnlineSearch.md#making-network-requests)は、 'flatMap'を使って暗黙的にプロデューサを開始します'start *'関数のどれも見ることができません。 – jjoelson

0

バインディング演算子<~を呼び出すと、プロデューサがすぐに開始されます。

SignalへのバインドとSignalProducerへのバインディングの主な違いは、SignalProducerが開始時に値をすぐに送信できることです。

はあなたの例の最後の行を削除し、あなたは違いを見ることができます: text.signalのみ、新しい更新プログラムの値を送信しているときに、それを起動したとき text.producer以来

myLabel1.text = "" 
myLabel2.text = "" 

let text = MutableProperty("abc") 

myLabel1.reactive.text <~ text.signal // no change 
myLabel2.reactive.text <~ text.producer // changed to "abc" 

はすぐにその現在の値​​を送信します。

したがって、MutablePropertyにバインドすると、ほとんどの場合、プロパティのプロデューサにバインドする必要があります。

関連する問題