我需要从DB获取数据。如果它为空,则从服务器获取数据并将其插入数据库。 这是我的代码,
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()
,结果相同。
答案 0 :(得分:1)
(来自评论):
如果您使用toList
,则需要有限的流。根据OP的反馈,allDatas
来源无限但返回空List
。该决议至少应用take(1)
来获得allDatas
和List
的一个答案
然后有选择地过滤掉空switchIfEmpty
,以便return allDatas.take(1).filter(list -> !list.isEmpty())
.switchIfEmpty(datas())
.doOnNext(datas -> userStoreDao.insert(datas));
切换到替代方案:
PM> $PSVersionTable.PSVersion
Major Minor Build Revision
----- ----- ----- --------
2 0 -1 -1