В настоящее время у меня есть метод в классе репозитория, который извлекает данные как из локального кэша, так и из удаленного API.
public Observable<List<Items>> getItemsForUser(String userId {
return Observable.concatArrayEager(
getUserItemsLocal(userId), // returns Observable<List<Items>>
getUserItemsRemote(userId) // returns Observable<List<Items>>
);
}
В настоящее время метод сначала выбирает локальные данные (которые могут быть устаревшими) ивозвращает его, затем обновляет его свежими данными из удаленного API.
Я хочу изменить реализацию на использование Observable.merge
, чтобы, если запрос удаленного API завершился первым, эти данные были показаны первыми.Однако, если я просто использую Observable.merge
, я обеспокоен тем, что запрос локальной базы данных может вернуть устаревшие данные, которые затем перезапишут свежие данные с удаленного компьютера.
По сути, я хочу что-то вроде:
public Observable<List<ShoutContent>> getItemsForUser(String userId, ErrorCallback errorCallback) {
return Observable.merge(
getUserItemsRemote(userId),
getUserItemsLocal(userId)
.useOnlyIfFirstResponse()
}
Так что, если сначала выполняется удаленный запрос API, то этот ответ является единственным, который возвращается.Но если локальный запрос завершается первым, я хочу вернуть его, а затем вернуть удаленный запрос после его завершения.Есть ли в RxJava что-то подобное встроенное?
Редактировать: Я хотел бы добавить, что getUserItemsRemote
обновляет локальную базу данных, когда Observable испускает, но я не думаю, что смогу гарантировать, что база данных будетобновляется до завершения локального запроса, что оставляет вероятность того, что локальный запрос ответит устаревшими данными.