Cold Observable 和观察者是一对一的关系,也就是每次产生订阅时,都会是一个新的资料流。而 Hot Observable 和观察者是一对多的关系,也就是每次产生订阅时,都会使用 「同一份资料流」,将 Cold Observable 转换成 Hot Observable 的过程,就是将原来的资料流公用。
multicast
Cold Observable 每次订阅只会对应一个观察者,因此也可以说成将资料播放给唯一的观察者,因此也称为单播,而 multicast 就是将 Observable 变成多播的情况。
在 multicast 内必须指定一个产生 Hot Observable 的工厂方法,也就是建立 Subject、BehaviorSubject 等逻辑。
func cold2Hot() { |
2022-10-21 16:49:22.050847+0800 RxDemo[87512:4847046] add observer 1 |
当使用 multicast 时,新的 Observable 是一个 ConnectableObservable
,和一般的 Observable 的差别在于 ConnectableObservable 是多播的,而且必须调用 connect 方法,才会开始进行多播操作。
看上面的例子,也可看出只有在 connect 后才开始发送信号。
转换过程:
shareReplay
public func share(replay: Int = 0, scope: SubjectLifetimeScope = .whileConnected) -> Observable<Element> { |
shareReplay 的返回值是一个 `Observable
但同时,他已经转换成了热信号,那么他就也有热信号的特点:当有新的订阅者时,并不会从头开始发送信号 – 只有在被第一次订阅时,从头开始发送信号,新的订阅者只能接收到在其订阅后发送的信号。
scope == .forever 时实现的核心逻辑在 RefCountSink 的 run 方法中:
// 只有当第一次被订阅时 |
当 scope == .whileConnected 时,replay 的次数为 0 或 1 时做了特殊处理,但是他们发送信号的处理逻辑是一样的:在 ShareWhileConnected 或者 ShareReplay1WhileConnected 的 subscribe 方法中:
override func subscribe<Observer: ObserverType>(_ observer: Observer) -> Disposable where Observer.Element == Element { |
publish 与 replay
publish 与 replay 都是对multicast 的封装,使用了不同的热信号类型进行转换。
public func publish() -> ConnectableObservable<Element> { |