如何使用switchIfEmpty?
How to use switchIfEmpty?
我需要从数据库中获取数据。如果为空,则从服务器获取数据并将其插入数据库。
这是我的代码,
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();
当第一部分returns为空结果时到达第二部分。 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));
我需要从数据库中获取数据。如果为空,则从服务器获取数据并将其插入数据库。 这是我的代码,
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();
当第一部分returns为空结果时到达第二部分。 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));