ReactiveCocoa - concat flatten 策略未按预期工作
Posted
技术标签:
【中文标题】ReactiveCocoa - concat flatten 策略未按预期工作【英文标题】:ReactiveCocoa - concat flatten strategy not working as expected 【发布时间】:2017-01-05 08:57:29 【问题描述】:我从几天开始学习reactive-cocoa,今天我在玩reactivecocoa(reactiveSwift)的flatten方法,我尝试执行为concat提供的sn-p在文档Basic operators 中展平。这是sn-p:
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】:正如ReactiveSwift's slack channel 中所述,这是预期的结果。
Quoting the documentation:
开始观察外部事件流。在前一个事件流完成之前,不会观察到每个后续事件流。
所以numbersSignal
只会在lettersObserver
完成后发送值。
【讨论】:
知道了。谢谢:)以上是关于ReactiveCocoa - concat flatten 策略未按预期工作的主要内容,如果未能解决你的问题,请参考以下文章