如何在 onComplete 中使用 observable (Rxjava2)

How to use observable in onComplete (Rxjava2)

我正在尽可能多地使用 rxjava 编写我的应用程序,但我遇到了以下问题。

我有一个与 api 同步数据的方法,我根据时间戳下载内容。所以我想要以下数据流:

获取上次时间戳 -> 下载数据 -> 保存数据 -> 如果没有错误发生则更新时间戳

问题是我从 api 响应中收到时间戳以避免设备之间的日期差异,并且一旦我转换来自 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 方法没有从 observable 接收参数 (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 的新手所以如果你有一般的建议我会很高兴知道 =]

P.S我不知道这段代码是否可以编译,因为我只是在这里写它作为示例。

这个怎么样:

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