Оператор кэширования RxSwift для Completable - PullRequest
0 голосов
/ 04 февраля 2019

Я готов воспроизвести последний результат Completable, я верю точно так же, как описанный здесь оператор .cache() .

Следующие выходные данные кода 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 голосов
/ 04 февраля 2019

Если вам не нужна возможность подключения, а просто требуется поведение кэширования, существует очень простая реализация для оператора cache:

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

Если, с другой стороныИтак, вы заботитесь о подключаемости вашего наблюдаемого, просмотр исходного кода для приведенного выше оператора воспроизведения дает вам реализацию для желаемого поведения:

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

Multicast - хитрый оператор.

Он берет события из наблюдаемого источника (себя) и отправляет их субъекту, которому он передается.Затем он перенаправит значения этой темы любым подписчикам.

Подписка на наблюдаемый источник происходит только тогда, когда результат многоадресной рассылки подключен к через вызов connect.

В данном случае использования, поскольку ReplaySubjectведет себя как кеш, такое использование многоадресной рассылки позволяет любому дальнейшему подписчику получать значения, излучаемые источником.

...