为什么第二个订阅者接收RxSwift中的所有元素?



我目前有以下代码。两个监听器都能够接收所有发出的5个值。

然而,我很困惑,第二个听众不应该错过前几个元素吗?

import RxSwift
import Foundation
let disposeBag = DisposeBag()
let mainObservable = Observable<String>.create { observer in
observer.onNext("Element 1")
observer.onNext("Element 2")
observer.onNext("Element 3")
observer.onNext("Element 4")
observer.onNext("Element 5")
observer.onCompleted()
return Disposables.create()
}
mainObservable.subscribe(onNext: { element in
print("listener1 received: (element)")
}, onCompleted: {
print("listener1 completed")
}).disposed(by: disposeBag)
// The following prints out immediately
// listener1 received: Element 1
// listener1 received: Element 2
// listener1 received: Element 3
// listener1 received: Element 4
// listener1 received: Element 5
// listener1 completed
DispatchQueue.main.asyncAfter(deadline: .now() + 2) {
mainObservable.subscribe(onNext: { element in
print("listener2 received: (element)")
}, onCompleted: {
print("listener2 completed")
}).disposed(by: disposeBag)
}
// The following prints out after 2 seconds
// listener2 received: Element 1 (why am I getting this one?)
// listener2 received: Element 2 (why am I getting this one?)
// listener2 received: Element 3 (why am I getting this one?)
// listener2 received: Element 4
// listener2 received: Element 5
// listener2 completed

No。两个订阅者都将并且应该接收到所有的元素。

要理解为什么你只需要看看这部分代码:

let mainObservable = Observable<String>.create { observer in
observer.onNext("Element 1")
observer.onNext("Element 2")
observer.onNext("Element 3")
observer.onNext("Element 4")
observer.onNext("Element 5")
observer.onCompleted()
return Disposables.create()
}

该代码创建了一个Observable。它说,"每当观察者订阅我,我将向它发送五个下一步事件和一个已完成事件"

您有两个观察者订阅它,因此每个观察者接收五个next事件和一个已完成的事件。

大多数可观察对象都是这样工作的,它们被称为"可观察对象基本上意味着它们不会在观察者之间共享副作用,每个观察者都有自己的一组

有一些是"热的",这意味着它们确实有共同的副作用。这类可观察对象的一个例子是UI事件。

你可以通过搜索关于热观测和冷观测的信息来了解更多。这里有一篇关于这个主题的非常好的文章:https://www.davesexton.com/blog/post/Hot-and-Cold-Observables.aspx

关于这个主题的一个很好的视频在这里:https://egghead.io/lessons/rxjs-demystifying-cold-and-hot-observables-in-rxjs

相关内容

  • 没有找到相关文章

最新更新