RxJava как кэшировать статическое наблюдаемое

Я хочу кэшировать следующие наблюдаемые

val currentUser: Observable<User>
    get() = Observable.create { emitter ->
            ...
    }

Поскольку наблюдаемая, возвращаемая create, статична, я не могу просто вызвать для нее cache. Причина, по которой я это делаю, заключается в том, что наблюдаемый объект доступен в разных частях приложения, и я хочу, чтобы он немедленно возвращал последнее значение, вместо того, чтобы каждый раз выполнять сетевые вызовы.

1
0
202
2

Ответы 2

Ты пытался:

val currentUser: Observable<User> = Observable.create { emitter ->
    ...
}.replay(1)
 .autoConnect(0)

?

Что означает autoConnect (0)? Наблюдаемое всегда связано?

Jack Guo 22.08.2018 14:54

Даже если подписчиков нет, Observable сохраняет последнее значение, а не удаляется.

EpicPandaForce 22.08.2018 18:03

Это было именно то, что я искал, но не думал, что это возможно в RxJava. Большое спасибо

Jack Guo 22.08.2018 19:08

Когда я узнал, что это возможно. Я считаю это святым Граалем RxJava

EpicPandaForce 22.08.2018 19:42

Что делать, если пользователь выходит из системы и я хочу, чтобы он был удален?

Jack Guo 22.08.2018 20:44

Эм-м-м. Возможно, просто вызовите на нем dispose(), а затем дайте ему умереть и воссоздайте его, когда снова появится активный пользователь. Если приложение одноэлементное, то неудачным способом его моделирования было бы сделать эту вещь допускающей значение NULL. В основном, чтобы избавиться от него, вызовите dispose(), но тогда он больше не будет работать, и его нужно будет воссоздать.

EpicPandaForce 22.08.2018 23:25

Благодаря EpicPandaForce это то, что я в итоге использовал. Мне пришлось указать тип эмиттера, иначе возникнет ошибка

val currentUser: Observable<User> = Observable.create { emitter: ObservableEmitter<User> ->
    ...
}.replay(1)
 .autoConnect(0)

Другие вопросы по теме