2017-02-01 9 views
0

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

ответ

2

Что об этом:

webService.getByLastUpdate(syncPreferences.getLastDownloadDate()) 
    .flatMapCompletable(response -> 
     repository 
      .insert(response.data) 
      .doOnComplete(() -> 
       syncPreferences.setLastDownloadDate(response.timeStamp) 
      ) 
    ); 

 Смежные вопросы

  • Нет связанных вопросов^_^