我实施了两个存储库以管理我的数据。因此,如果数据库中没有数据,则应向API询问相关信息。我在其他帖子中看到,可以使用 switchIfEmpty 解决这个问题,但它对我没用。
我尝试了以下代码。调用 restApiFlavorRepository.query(规范)行,但不会通知订阅者。
public Observable query(Specification specification) {
final Observable observable = flavorDaoRepository.query(specification);
return observable.map(new Func1() {
@Override
public Observable<List<Flavor>> call(Object o) {
if(((ArrayList<Flavor>)o).isEmpty()) {
return restApiFlavorRepository.query(specification);
}
return null;
}
});
}
和这个
public Observable query(Specification specification) {
final Observable observable = flavorDaoRepository.query(specification);
return observable.switchIfEmpty(restApiFlavorRepository.query(specification));
}
我还有空列表,我应该获得两种口味。
已更新
我在寻找什么,是这个......
public Observable query(Specification specification) {
Observable<List<Plant>> query = mRepositories.get(0).query(specification);
List<Plant> list = new ArrayList<>();
query.subscribe(plants -> list.addAll(plants));
Observable<List<Plant>> observable = Observable.just(list);
return observable.map(v -> !v.isEmpty()).firstOrDefault(false)
.flatMap(exists -> exists
? observable
: mRepositories.get(1).query(null));
}
它就像魅力一样! :)
答案 0 :(得分:21)
switchIfEmpty()
要求源完成而没有任何值才能切换到第二个源:
Observable.empty().switchIfEmpty(Observable.just(1))
.subscribe(System.out::println);
这个不会切换:
Observable.just(new ArrayList<Integer>())
.switchIfEmpty(Observable.just(Arrays.asList(2)))
.subscribe(System.out::println);
如果你想打开一个&#39;定制&#39;空虚的概念,您可以使用filter
:
Observable.just(new ArrayList<Integer>())
.filter(v -> !v.isEmpty())
.switchIfEmpty(Observable.just(Arrays.asList(2)))
.subscribe(System.out::println);