2017-05-24 3 views
0

Der Bindungsoperator (< ~) nimmt ein BindingSource Argument, sowohl Signal und SignalProducer das ProtokollReactiveCocoa: Unterschied zwischen der Bindung an ein Signal oder einen SignalProducer?

entsprechen würde ich ein UI-Element erwarten, die zu einem Hersteller gebunden ist, würde nicht „Ereignisse empfängt“, bis der Produzent gestartet in gewisser Weise, aber das scheint nicht der Fall

dh

let text = MutableProperty("abc") 

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

text.value = "def" 

verursacht beide Etiketten zu aktualisieren zu sein.

Ist das beabsichtigte Verhalten oder bin ich etwas missverstanden?

Antwort

1

Dies ist ein beabsichtigtes Verhalten. Sie können in the implementation of <~ sehen, dass start explizit aufgerufen wird (und die Verfügbarkeit des Herstellers ist an die Lebensdauer des Bindungsziels gebunden).

[EDIT]

Um zu klären, ist es nicht viel Sinn macht, zu binden, um die Produzent selbst auf einem Etikett in der Art und Weise Sie sich vorzustellen. Was passiert, wenn start mehrfach aufgerufen wird, um mehrere Signale zu erzeugen? Würde das Label die Werte vom ersten Signal, vom letzten Signal oder von allen Signalen zusammenführen? Es gibt keine intuitive Möglichkeit dafür zu arbeiten.

+0

Es scheint, dass ein SignalProducer aus den von Ihnen angegebenen Gründen kein gültiges verbindliches Ziel sein sollte? Wird der Aufruf implizit (vom POV des Anwenders) gestartet, spricht das dagegen, warum Signale und Produzenten in erster Linie unterschieden werden? – synndicate

+0

Ich kann die Verwirrung sehen, aber auf der anderen Seite ist '<~' nicht die einzige Funktion, die implizit einen Produzenten startet. 'flatMap' ist ein extrem häufiger Operator, der das gleiche tut. [Dieses Beispiel] (https://github.com/ReactiveCocoa/ReactiveSwift/blob/master/Documentation/Example.OnlineSearch.md#making-network-requests) aus der Reactive-Swift-Dokumentation verwendet 'flatMap', um Produzenten automatisch implizit zu starten obwohl keine der 'start *' Funktionen irgendwo zu sehen sind. – jjoelson

0

Der Producer startet sofort, wenn Sie den Bindeoperator <~ aufrufen.

Der Hauptunterschied zwischen der Bindung an ein Signal und an einen SignalProducer besteht darin, dass ein SignalProducer beim Start sofort Werte senden kann.

die letzte Zeile Ihres Beispiel entfernen, können Sie den Unterschied sehen:

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

let text = MutableProperty("abc") 

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

seit text.producer sendet seinen aktuellen Wert "abc" sofort, wenn Sie es starten, während text.signal nur Werte von neuen Updates sendet.

Wenn Sie also an eine MutableProperty binden, sollten Sie in den meisten Fällen an den Hersteller der Eigenschaft binden.

Verwandte Themen