Я пишу свое приложение так сильно, как я могу из rxjava, и у меня возникает следующая проблема.Как использовать наблюдаемые в onComplete (Rxjava2)
У меня есть метод, который синхронизирует данные с api, и я загружаю материал на основе метки времени. Поэтому я хотел бы следующий поток данных:
Получить последнюю метку времени -> Загрузка данных -> Сохранить данные -> Обновление метки времени, если нет ошибок ocurred
Проблема заключается в том, что я получаю временную метку ответа апи, чтобы избежать между устройствами, и как только я преобразую ответ от api, я теряю метку времени.
Вот упрощение тока:
class Response
{
Date timeStamp;
Data data;
}
interface IRepository
{
Completable insert(Data data);
}
interface IWebService
{
Observable<Response> getByLastUpdate(Date date);
}
class SyncPreferences
{
public Date getLastDownloadDate() { /**/ }
public void setLastDownloadDate(Date date){ /**/ }
}
public class SyncService
{
private final IRepository repository;
private final IWebService webService;
private final SyncPreferences syncPreferences;
public SyncService(IRepository repository, SyncPreferences syncPreferences, IWebService webService)
{
this.repository = repository;
this.webService = webService;
this.syncPreferences = syncPreferences;
}
private Completable sync()
{
return webService.getByLastUpdate(syncPreferences.getLastDownloadDate())
.doOnComplete((response) -> {
syncPreferences.setLastDownloadDate(response.timeStamp)
}) // What I would like to do
.flatMapCompletable((response) -> {
repository.insert(response.data);
});
}
}
Проблема заключается в том, что doOnComplete
метод не получает параметр (response
) от наблюдаемой, и я хотел бы установить метку времени в последнюю очередь, так если возникает ошибка, я могу просто повторить загрузку со старой меткой времени.
Единственное решение, которое я нашел было сделать механизм транзакций в SyncPreferences
, что я мог бы использовать так:
private Completable sync()
{
return webService.getByLastUpdate(syncPreferences.getLastDownloadDate())
.doOnNext((response) -> {
syncPreferences.setLastDownloadDate(response.timeStamp);
})
.flatMapCompletable((response) -> {
repository.insert(response.data);
})
.andThen(syncPreferences.commitChanges());
}
Я новичок в RxJava, так что если у вас есть предложения в целом я был бы рад знать = ]
PS Я не знаю, скомпилирован ли этот код, так как я просто написал его здесь для примера.