2016-04-02 9 views
2

Bir geri dönüştürücü görünümünü dizeyle filtreleyecek ve ayrıca yerel Realm db'yi denetleyecek ve sonradan bir düzeltme isteğinde bulunacak bir Rx Arama görünümü uygulamak istiyorum. tüm sonuçları çoğaltmadan birleştirir ?? Yani, başka bir deyişle: Bir arama görünümünde metin değiştirme olayı üzerinde, bir ağ isteği, bir db sorgusu yapmak için giriş dizesini kullanmak ve yinelenen sonuçlar olmadan birleştirmek istiyorumBir sorgulayıcı ile bir geri dönüştürücü görünümünü filtreleyecek bir Rx Arama görünümü nasıl oluşturulur

Bu benim ilk kodum:

RxSearchView.queryTextChanges(searchView) 
      .filter(charSequence -> !TextUtils.isEmpty(charSequence)) 
      .throttleLast(100, TimeUnit.MILLISECONDS) 
      .debounce(200, TimeUnit.MILLISECONDS) 
      .onBackpressureLatest() 
      .flatMap(charSequence -> userListPresenter.search(charSequence)) 
      .observeOn(AndroidSchedulers.mainThread()) 
      .subscribeOn(Schedulers.io()) 
      .onErrorResumeNext(Observable.empty()) 
      .subscribe((Action1) response -> userListPresenter.showSearchResult((List<UserModel>) response)); 

userListPresenter.search (charSequence)) yinelenmemiş birleştirilmiş tepkisinin gözlemlenebilir dönmelidir sayesinde :)

userListPresenter.search (charSequence)):

Observable.create(subscriber -> { 
     if (Utils.isNetworkAvailable(getContext())) { 
      if (!subscriber.isUnsubscribed()) { 
       subscriber.onNext(restApi.search(query)); 
       subscriber.onCompleted(); 
      } 
     }).mergeWith(
        Observable.create(subscriber -> { 
     if (!subscriber.isUnsubscribed()) { 
      subscriber.onNext(realmManager.getWhere(query)); 
      subscriber.onCompleted(); 
     } 
    })).collect(HashSet::new, HashSet::add) 
      .flatMap(Observable::from); 

cevap

3

Sorunuzu doğru anladıysam. Birden çok Gözlenebilir'in emisyonlarını birleştirmenin iyi bir yolu var, zip method'a bakın. Yani, arama yönteminiz şöyle görünür:

public Observable<List<MyItem>> search(CharSequence query) { 
    return Observable.zip(
       observeNetwork(query), 
       observeRealm(query), 
       new Func2<List<MyItem>, List<MyItem>, List<MyItem>>() { 
        @Override 
        public List<MyItem> call(List<MyItem> networkResult, List<MyItem> databaseResult) { 
         return merge(networkResult,databaseResult); 
        } 
       } 
      ); 
} 

private Observable<List<MyItem>> observeRealm(CharSequence searchString) { 
    return Observable.create(/* do your realm stuff */); 
} 

private Observable<List<MyItem>> observeNetwork(CharSequence searchString) { 
    return return Observable.create(/* do your network stuff */); 
} 

private List<MyItem> merge(List<MyItem> networkResult, List<MyItem> databaseResult) { 
    List<MyItem> result = new ArrayList<>(); 
    result.addAll(databaseResult); 
    for(MyItem newItem : networkResult){ 
     if(!databaseResult.contains(newItem)){ 
      result.add(newItem); 
     } 
    } 
    return result; 
}