我需要从数据库获取数据。如果为空,请从服务器获取数据并将其插入数据库。
这是我的代码,
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/