ReactiveCocoa - concat flatten策略未按预期工作

时间:2017-01-05 08:57:30

标签: ios swift reactive-cocoa reactive-cocoa-5 reactive-swift

我已经开始学习几天的反应可可,今天我正在玩反应性的flatten方法(reactiveSwift),我尝试执行 concat 的代码片段在文档Basic operators中展平。这是片段:

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 marbles - flatten(.concat) visual diagram,输出应该是这样的,

首先它应该有印刷的字母流,即

  

a,b,c

&安培;一旦letterStream完成,它应该打印数字流,即

  

1,2,3

所以这个观察的最终结果应该是

  

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

但是,我看到的连接输出是

  

[a,b,c,3]

为什么会这样?为什么只打印numberStream的最新值?字母流完成后,而不是打印整个数字流值。

如果我误解了某件事,请告诉我。欢呼声。

1 个答案:

答案 0 :(得分:4)

ReactiveSwift's slack channel所述,这是预期的结果。

Quoting the documentation

  

观察外部事件流。在前一个事件流完成之前,不会观察到每个后续事件流。

所以numbersSignal只会在lettersObserver完成后才会发送值。