2016-03-07 41 views
0

我正在運行基本操作符,並遇到combineLatest操作符行爲的差異。我不確定這是一個錯誤還是我無法理解Signals和SignalProducers之間的差異。combineLatest行爲中的差異信號v SignalProducer(ReactiveCocoa 4)

let (numbersSig, numbersOb) = Signal<Int, NoError>.pipe() 
let (lettersSig, lettersOb) = Signal<String, NoError>.pipe() 
let signal = combineLatest(numbersSig, lettersSig) 
signal.observeNext({value in print(value)}) 

numbersOb.sendNext(1) 
lettersOb.sendNext("A") 
lettersOb.sendNext("B") 

產地: (1, 「A」) (1, 「B」)

但是,如果我寫的東西我會考慮使用SignalProducers是等效代碼:

let numberProducer = SignalProducer<Int, NoError> { (observer, disposable) in 
    for v in [1] { observer.sendNext(v) } 
} 

let letterProducer = SignalProducer<String, NoError> { (observer, disposable) in 
    for v in ["A", "B", "C", "D"] { observer.sendNext(v) } 
} 

let combinedProducer = combineLatest(numberProducer, letterProducer) 
combinedProducer.on(next: {value in print(value) }).start() 

輸出: (1, 「d」)

我故意留下的observer.sendCompleted()從SignalProducers的,因爲我認爲這會負責,但事實並非如此。我錯過了什麼?

回答

0

是的,這看起來像一個錯誤。你介意在Github回購上打開一個問題,以便我們可以在那裏看看?更好的是,如果您可以在測試失敗的情況下打開PR,那將會非常棒! :)

我會檢查一些可能是解決方法的東西:如果您使用startWithNext而不是on + start,您會得到相同的結果嗎?

0

感謝您的建議NachoSoto。我嘗試了你建議的替代方法,輸出沒有改變。

呼籲combinedProducer開始把手, 內部字母和數字的生產者調用start(具體見liftRight在 SignalProducer:當我發佈這個問題在Github上回購我從香味(布萊恩·托馬斯)接受下面的答案.swift,當其他Producer.startWithSignal的 閉包返回它將運行你的sendNext代碼)。由於它們是 同步,所以在數字製作者開始返回值之前,字母生產者只是將其所有值「相互聯繫」爲 。您可以通過在生產商 示例中的combineLatest方法調用中顛倒它們來測試此 。如果你想獲得你的第一個 測試的「推價值觀的行爲嘗試

let (numbersSig, numbersSink) = Signal<Int, NSError>.pipe() 
let (lettersSig, lettersSink) = Signal<String, NSError>.pipe() 
let numberProducer = SignalProducer(signal: numbersSig) 
let letterProducer = SignalProducer(signal: lettersSig) 

let combinedProducer = combineLatest(numberProducer, letterProducer) 
combinedProducer.on(next: {value in print(value) }).start() 

lettersSink.sendNext("A") 
numbersSink.sendNext(1) 
lettersSink.sendNext("B") 
numbersSink.sendNext(2) 
lettersSink.sendNext("C") 

我試圖扭轉numberProducer和letterProducer他建議,輸出確實是因爲我使用的信號,即

最初遇到
let numberProducer = SignalProducer<Int, NoError> { (observer, disposable) in 
    for v in [1] { observer.sendNext(v) } 
} 

let letterProducer = SignalProducer<String, NoError> { (observer, disposable) in 
    for v in ["A", "B", "C", "D"] { observer.sendNext(v) } 
} 

let combinedProducer = combineLatest(letterProducer, numberProducer) 
combinedProducer.startWithNext {value in print(value)} 

產地: ( 「A」,1) ( 「B」,1) ( 「C」,1) ( 「d」,1)

你還認爲這是一個錯誤還是一個實現行爲?

相關問題