切换可观察,如果它是空的
问题描述:
我实施了两个存储库,以管理我的数据。所以,如果数据库中没有数据,它应该向API询问。我在其他帖子看到,这可以使用switchIfEmpty解决,但它不适用于我。切换可观察,如果它是空的
我试过下面的代码。该行restApiFlavorRepository.query(specification)被调用,但用户从未被通知。
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));
}
和它的作品般的魅力! :)
答
的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);
如果你想打开一个'自定义'空虚的概念,你可以使用filter
:
Observable.just(new ArrayList<Integer>())
.filter(v -> !v.isEmpty())
.switchIfEmpty(Observable.just(Arrays.asList(2)))
.subscribe(System.out::println);
'flavorDaoRepository。查询“实际上发出一个空列表或刚刚完成? – akarnokd
发出一个空列表。 –
我会问@akarnokd的答案是否正确,因为这是找到我的解决方案的途径。谢谢! –