切换可观察,如果它是空的

切换可观察,如果它是空的

问题描述:

我实施了两个存储库,以管理我的数据。所以,如果数据库中没有数据,它应该向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)); 
} 

和它的作品般的魅力! :)

+0

'flavorDaoRepository。查询“实际上发出一个空列表或刚刚完成? – akarnokd

+0

发出一个空列表。 –

+0

我会问@akarnokd的答案是否正确,因为这是找到我的解决方案的途径。谢谢! –

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);