我愿意重播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
,我想知道它已经完成...
有办法吗?
答案 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的行为类似于缓存,因此多播的这种使用使任何其他订阅者都可以接收源发出的值。