RxSwift缓存运营商Completable

问题描述 投票:1回答:1

我愿意重播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完成后,我想知道,它已经完成...

有没有办法做到这一点?

rx-swift
1个回答
2
投票

如果你不关心的可能性连接,但只是希望有一个缓存行为,没有为cache运营商一个非常简单的实现:

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

如果,另一方面,你照顾你观察到的连接性,对于上述重播运营商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行为类似于高速缓存,多播的这种用法使得任何进一步的用户接收由源emmited的值。

© www.soinside.com 2019 - 2024. All rights reserved.