RxSwift高速缓存运算符可完成

时间:2019-02-03 23:23:43

标签: rx-swift

我愿意重播Completable的最后结果,我相信就像.cache() operator described here一样。

以下RxSwift代码输出:“已完成”

let connectable = Completable.empty().asObservable().replay(1)
connectable.subscribe(onCompleted: { print("completed") })
connectable.connect()

现在,如果我在.connect()之前.subscribe(),我什么也没得到:

let connectable = Completable.empty().asObservable().replay(1)
connectable.connect()
connectable.subscribe(onCompleted: { print("completed") })

对于我来说,如果.subscribe()完成后我connectable,我想知道它已经完成...

有办法吗?

1 个答案:

答案 0 :(得分:2)

如果您不关心连接的可能性,而只是希望缓存行为,那么cache运算符的实现非常简单:

extension PrimitiveSequence where TraitType == CompletableTrait, ElementType == Swift.Never {
  public func cache() -> Observable<ElementType> {
    return self.asObservable().share(replay: 1, scope: .forever)
  }
}

反之,如果您关心可观察对象的 connectability ,则上述重放运算符的look at the source code为您提供所需行为的实现:

extension PrimitiveSequence where TraitType == CompletableTrait, ElementType == Swift.Never {
  public func cache() -> ConnectableObservable<ElementType> {
    return self.asObservable().multicast(ReplaySubject.create(bufferSize: 1))
  }
}

多播是一个棘手的运算符。

它从可观察的源(自身)获取事件,并将事件发送给传递的主题。然后它将把该主题的值转发给任何订户。

只有通过connect调用将组播结果连接到 时,才可以观察到对源的订阅。

在当前用例中,由于ReplaySubject的行为类似于缓存,因此多播的这种使用使任何其他订阅者都可以接收源发出的值。