2017-02-10 15 views
0

我有一個EditText並在它的正下方ViewPager有四個選項卡,我目前正在做的是當文本更改時使用Retrofit執行對Rest服務的請求。執行取決於單個RxTextView的多個不同的翻新呼叫

RxTextView.textChangeEvents(searchbar.getEditText()) 
      .debounce(400, TimeUnit.MILLISECONDS) 
      .filter(new Func1<TextViewTextChangeEvent, Boolean>() { 
       @Override 
       public Boolean call(TextViewTextChangeEvent text) { 
        return (text.text().length() > 2); 
       } 
      }) 
      .subscribeOn(AndroidSchedulers.mainThread()) 
      .observeOn(Schedulers.io()) 
      .switchMap(new Func1<TextViewTextChangeEvent, Observable<?>>() { 
       @Override 
       public Observable<?> call(TextViewTextChangeEvent textViewTextChangeEvent) { 
        String searchBarText = textViewTextChangeEvent.text().toString(); 

        switch (visibleTab) { 
         case TAGS: 
          return presenter.executeSearchPostsByTag(searchBarText, String.valueOf(0)); 
         case PEOPLE: 
          return presenter.executeSearchPostsByPeople(searchBarText, String.valueOf(0)); 
         case COMPANIES: 
          return presenter.executeSearchPostsByCompanies(searchBarText, String.valueOf(0)); 
         case JOBS: 
          return presenter.executeSearchPostsByJobs(searchBarText, String.valueOf(0)); 
         default: 
          return presenter.executeSearchPostsByTag(searchBarText, String.valueOf(0)) 
            .toCompletable().toObservable(); 
        } 

       } 
      }) 
      .subscribeOn(Schedulers.io()) 
      .observeOn(AndroidSchedulers.mainThread()) 
      .subscribe(new Observer<Object>() { 
      // here I use EventBus to pass the results to the Fragments (Tabs) 
      // ... code omitted ... 

正如你可以從每個選項卡的代碼注意到我有不同的請求。

但現在需求已經改變,並且對於每個文本改變都有EditText我必須同時執行全部四個請求。

我搜索了很多,我發現我可以使用combineLatest' so I added all four calls to combineLatest`但因爲他們都取決於文本的變化沒有發生。

Observable.combineLatest(presenter.executeSearchPostsByTag(/** what to add as queryText **/), 
     presenter.executeSearchPostsByJobs(/** what to add here as queryText**/), //omits the other two calls) 

正如你在右上方看到的,我不知道如何通過queryText。必須有一種方法將combineLatest代碼與RxTextView.textChangeEvents(searchbar.getEditText())...代碼相結合,直到我開始發佈的switchMap,但我找不到它。

編輯:那也許是combineLatest錯了,我可以這樣做:

   .map(new Func1<String, Boolean>() { 
       @Override 
       public Boolean call(String s) { 

        presenter.executeSearchPostsByTag(s, String.valueOf(0)); 
        presenter.executeSearchPostsByPeople(s, String.valueOf(0)); 
        presenter.executeSearchPostsByJobs(s, String.valueOf(0)); 
        presenter.executeSearchPostsByCompanies(s, String.valueOf(0)); 

        return true; 

       } 
      }) 

但我不知道如何得到的結果給用戶

回答

1

你靠近。只需將switchmap替換爲:

.flatMap(new Func1<TextViewTextChangeEvent, Observable<CombinedData>>() { 
    @Override 
    public Observable<CombinedData> call(TextViewTextChangeEvent textViewTextChangeEvent) { 
     String searchBarText = textViewTextChangeEvent.text().toString(); 

     return Observable.combineLatest(
       presenter.executeSearchPostsByTag(searchBarText, String.valueOf(0)), 
       presenter.executeSearchPostsByPeople(searchBarText, String.valueOf(0)), 
       ...); 
     }  
}) 

爲了提高可讀性,請創建一種提取組合部分的方法。例如:

Observable<CombinedData> fetchData(String searchBarText) { 
    return Observable.combineLatest(
      presenter.executeSearchPostsByTag(searchBarText, String.valueOf(0)), 
      presenter.executeSearchPostsByPeople(searchBarText, String.valueOf(0)), 
      ...); 
} 

但是如果可以的話,最好將它分成四部分。聲明可觀察到的:

​​3210

然後你訂閱的四倍,爲每個請求:?

.flatMap(new Func1<TextViewTextChangeEvent, Observable<Post>>() { 
    @Override 
    public Observable<Post> call(TextViewTextChangeEvent textViewTextChangeEvent) { 
     String searchBarText = textViewTextChangeEvent.text().toString(); 
     return presenter.executeSearchPostsByTag(searchBarText, String.valueOf(0)); 
     } 
}) 
.subscribe(... 
+0

所以我可以訂閱四次'requestObservable'那是新的我!我會從現在的晚些時候開始檢查它,並且會告訴你它是如何發生的(並接受答案!)。謝謝! – Mes

相關問題