2016-05-31 54 views
2

我實施了兩個存儲庫,以管理我的數據。所以,如果數據庫中沒有數據,它應該向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的答案是否正確,因爲這是找到我的解決方案的途徑。謝謝! –

回答

15

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