2017-05-24 101 views
0

的結合運算符(<〜)取BindingSource說法,既SignalSignalProducer符合協議ReactiveCocoa:與Signal或SignalProducer綁定的區別?

我期望綁定到生產者直到生產者開始將不是「接收事件」的UI元素在某些方面,但是這似乎並沒有被

let text = MutableProperty("abc") 

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

text.value = "def" 

導致兩個標籤,以更新的情況。

這是打算的行爲還是我誤解了一些東西?

回答

1

這是打算的行爲。您可以看到in the implementation of <~明確調用了start(並且生產者的處置與綁定目標的生命週期相關聯)。

[編輯]

爲了澄清,它沒有多大意義的生產者本身綁定到你想象的方式的標籤。如果start被多次調用以產生多個信號會發生什麼情況?標籤是否會從第一個信號,最近的信號或所有信號合併到一起?沒有直觀的方式來工作。

+0

看來SignalProducer不應該是您提供的原因的有效綁定目標?開始被隱式調用(來自用戶的POV)違背了爲什麼信號和生產者首先被區分爲否? – synndicate

+0

我可以看到混亂,但另一方面'<〜'不是隱式啓動生產者的唯一函數。 'flatMap'是一個非常普通的操作符。 Reactive-Swift文檔中的[This example](https://github.com/ReactiveCocoa/ReactiveSwift/blob/master/Documentation/Example.OnlineSearch.md#making-network-requests)使用'flatMap'來隱式地啓動生產者儘管沒有任何'start *'函數可以被看到。 – jjoelson

0

當您調用綁定操作符<~時,生產者立即啓動。

綁定到Signal和SignalProducer的主要區別在於SignalProducer可以在啓動時立即發送值。

刪除您的示例中的最後一行,就可以看到區別:

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

let text = MutableProperty("abc") 

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

因爲text.producer當你啓動它,而text.signal只發送新的更新值發送其當前價值​​馬上。

所以,當你綁定到MutableProperty,在大多數情況下,你應該綁定到屬性的生產者。

相關問題