Если вам не нужна возможность подключения, а просто требуется поведение кэширования, существует очень простая реализация для оператора 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ведет себя как кеш, такое использование многоадресной рассылки позволяет любому дальнейшему подписчику получать значения, излучаемые источником.