В моем приложении для Android я использую интерфейс репозитория домена, который поддерживается локальным БД, реализованным с использованием SqlBrite и сетевого api с возможностью обновления. Поэтому у меня есть метод getDomains(): Observable<List<Domain>>
в репозитории и два соответствующих метода в моей модификации и SqlBrite. Я не хочу объединяться или сливаться, или амбировать эти две наблюдаемые. Я хочу, чтобы мой репозиторий получал данные только из SqlBrite, и поскольку SqlBrite возвращает QueryObservable, который запускает onNext()
каждый раз, когда базовые данные меняются, я могу самостоятельно выполнить свой сетевой запрос и сохранить результаты в SqlBrite и обновить Observable с извлечением из сети и сохранить в DB данные. Так что я пытался реализовать getDomains()
метод моего репозитория следующим образом:RxJava поток данных с SqlBrite и дооснащением
fun getDomains(): Observable<List<Domain>> {
return db.getDomains()
.doOnSubscribe {
networkClient.getDomains()
.doOnNext { db.putDomains(it) }
.onErrorReturn{ emptyList() }
.subscribe()
}
}
Но в этом случае каждый раз, когда клиент должен подписаться, каждый раз, когда он будет делать сетевые запросы, которые не так хорошо. Я думал о других операторах do...
, чтобы пересылать запросы там, но doOnCompleted()
в случае QueryObservable никогда не будет вызван, пока я не позвоню toBlocking()
где-то, чего я не буду, doOnEach()
тоже не очень хорошо, поскольку он делает запросы каждый раз, когда элемент из db извлечен. Я также пытался использовать оператор replay()
, но, несмотря на то, что в этом случае кэшированный Observable, подписка происходит и приводит к сетевым запросам. Итак, как можно объединить эти два Наблюдения в желаемом порядке?
, откуда должно прибыть государство? –
Это деталь реализации в зависимости от вашего варианта использования. 'stateDeterminer.getState()' возвращает 'Observable'. это может быть проверка, если база данных пуста, а затем возвращает 'State.NO_DATA' или элемент времени (т. е. возврат' State.SYNC_IN_BACKGROUND' будет возвращаться каждые 24 часа, чтобы данные обновлялись один раз в день) и так далее , Это действительно зависит от того, что вы хотите достичь, и как часто и когда вы хотите синхронизировать, выполняя сетевой вызов. –
sockeqwe
имеет смысл. Я хочу получать свежие данные каждый раз, когда пользователи запускают приложение и «getDomains» вызывается в первый раз, а затем в течение некоторого времени, например. 120 секунд, когда звонки subscribe() я хочу вернуть только из db. Но если пользователи снижают список для обновления, я хочу перезагрузить данные из сети –