1

私は数日からリアクティブ ココアを学び始めました。今日、リアクティブ ココア (reactiveSwift) のフラット化メソッドで遊んでいました。ドキュメンテーションBasic operatorでconcat flattening に指定されたスニペットを実行してみました。スニペットは次のとおりです。

let (lettersSignal, lettersObserver) = Signal<String, NoError>.pipe()
let (numbersSignal, numbersObserver) = Signal<String, NoError>.pipe()
let (signal, observer) = Signal<Signal<String, NoError>, NoError>.pipe()

signal.flatten(.concat).observeValues { print($0) }

observer.send(value: lettersSignal)
observer.send(value: numbersSignal)
observer.sendCompleted()

numbersObserver.send(value: "1")    // nothing printed
lettersObserver.send(value: "a")    // prints "a"
lettersObserver.send(value: "b")    // prints "b"
numbersObserver.send(value: "2")    // nothing printed
lettersObserver.send(value: "c")    // prints "c"
lettersObserver.sendCompleted()     // prints "1, 2"
numbersObserver.send(value: "3")    // prints "3"
numbersObserver.sendCompleted()

ドキュメントとインタラクティブな視覚化ダイアグラム ( RAC マーブル - flatten(.concat) 視覚的ダイアグラム )によると、出力は次のようになります。

まず、文字ストリームを出力する必要があります。つまり、

a、b、c

& letterStream が完了すると、数値ストリームが出力されているはずです。

1、2、3

したがって、この観察の最終的な出力は

[a、b、c、1、2、3]

ただし、私が見ている連結出力は、

[a、b、c、3]

これはなぜですか?numberStream の最新の値のみが出力されるのはなぜですか? 文字ストリームが完了したら、数値ストリームの値全体を出力する代わりに。

私が何かを誤解した場合はお知らせください。乾杯。

4

1 に答える 1