RxSwift - 合并如何处理同时发生的事件?
RxSwift - How does merge handle simultaneous events?
所以我有一个看起来像这样的代码:
let a = Observable.just("A").delay(.seconds(3), scheduler: MainScheduler.instance)
let b = Observable.just("B").delay(.seconds(3), scheduler: MainScheduler.instance)
Observable.merge([a, b]).subscribe(onNext: { print([=10=]) })
我认为打印顺序应该是随机的,因为稍早完成的延迟将首先通过合并发出。但是顺序似乎完全由传递给合并的数组中变量的顺序决定。
这意味着 .merge([a, b])
打印出
A
B
但是 .merge([b, a])
打印出
B
A
为什么会这样?这是否意味着合并以某种方式处理并发事件,我可以相信具有相同延迟的事件将始终按数组中的顺序发出?
我知道我可以使用 .from(["A", "B"])
轻松解决它,但我现在很想知道合并究竟是如何工作的。
您将两个延迟都放在同一个线程上(我怀疑订阅也在该线程上发生,)因此它们将按照订阅的顺序在同一个线程上执行。由于 merge
的当前实现按照它接收到的顺序订阅了可观察对象,所以你会得到你所看到的行为。但是,重要的是要注意你不能依赖这个,不能保证它对每个版本的库都是正确的。
所以我有一个看起来像这样的代码:
let a = Observable.just("A").delay(.seconds(3), scheduler: MainScheduler.instance)
let b = Observable.just("B").delay(.seconds(3), scheduler: MainScheduler.instance)
Observable.merge([a, b]).subscribe(onNext: { print([=10=]) })
我认为打印顺序应该是随机的,因为稍早完成的延迟将首先通过合并发出。但是顺序似乎完全由传递给合并的数组中变量的顺序决定。
这意味着 .merge([a, b])
打印出
A
B
但是 .merge([b, a])
打印出
B
A
为什么会这样?这是否意味着合并以某种方式处理并发事件,我可以相信具有相同延迟的事件将始终按数组中的顺序发出?
我知道我可以使用 .from(["A", "B"])
轻松解决它,但我现在很想知道合并究竟是如何工作的。
您将两个延迟都放在同一个线程上(我怀疑订阅也在该线程上发生,)因此它们将按照订阅的顺序在同一个线程上执行。由于 merge
的当前实现按照它接收到的顺序订阅了可观察对象,所以你会得到你所看到的行为。但是,重要的是要注意你不能依赖这个,不能保证它对每个版本的库都是正确的。