我需要从数据库获取数据。如果为空,请从服务器获取数据并将其插入数据库。
这是我的代码,

public Flowable<List<Data>> test() {
    return dataDao.allDatas()
           .switchIfEmpty(datas())
                .doOnNext(datas -> userStoreDao.insert(datas))
           );
}

public Flowable<List<Data>> datas() {
    return Flowable.zip(userFavoriteDatas(), userOtherDatas(),
        (favoriteDatas, otherDatas) -> {
            favoriteDatas.addAll(otherDatas);
            return favoriteDatas;
        });
}

public Flowable<List<Data>> userFavoriteDatas() {
    return userDatas()
        .map(UserDatas::favoriteDatas)
        .flatMapIterable(datas-> datas)
        .map(aLong -> new UserData(aLong, 1))
        .toList()
        .toFlowable();
}

public Flowable<List<Data>> userOtherDatas() {
    return userDatas()
        .map(UserDatas::otherDatas)
        .flatMapIterable(datas-> datas)
        .map(aLong -> new UserData(aLong, 1))
        .toList()
        .toFlowable();
}

private Flowable<Datas> userDatas() {
    return api
        .userDatas()
        .toFlowable()
        .share();
}

@GET("user/datas")
Single<Datas> datas();


当第一部分返回空结果时,它将到达第二部分。直到最后,当我只运行它的第二部分时,datas()才到达终点,但是与switchIfEmpty()结合使用时,它到达了userDatas()并且没有完成

我也尝试了concat(),结果相同。

最佳答案

(摘自评论):

如果使用toList,则需要有限的流。根据OP的反馈,allDatas源是无限的,但返回了空的List。解决方案是至少应用take(1)allDatas获得准确的一个响应,然后
然后有选择地过滤出空的List,以便switchIfEmpty可以切换到其他选项:

return allDatas.take(1).filter(list -> !list.isEmpty())
       .switchIfEmpty(datas())
       .doOnNext(datas -> userStoreDao.insert(datas));

关于android - 如何使用switchIfEmpty?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/45549827/

10-10 09:59