2016-09-21 49 views
8

をデバウンスしていないマージのTextViewで開かれた一部のコンテンツを持つファイルをRxJavaは、私は2つの観測持っデバウンス観測

観察可能なE(編集):TextViewの中で編集したファイルの内容

私はE observableをデバウンスし、それをO observableとマージしたいと思います。

obs = Observable.merge(E.debounce(2000, TimeUnit.MILLISECONDS) , O) 
       .subscribe(content->System.out.println("new content: " + content)) 

問題は、Eは、イベントE1と右を発する場合にOがO1イベントを発した後、我々は出力を持っているということです。

new content: O1 
new content: E1 // this output is rebundant (cuz we already have newer content O1) 

これは何が起こっているの図である。diagram

debounced observableからこの過度の古いイベントを取り除くにはどうすればよいですか?

+1

なぜ 'debounce'演算子を' merge'作業から移動しないのですか? –

+0

@TassosBassoukos、編集イベント(E1)は非常に頻繁です(実際にはキー入力イベントです)ので、私はそれをデバウンスしたいと思います。しかし、私がファイルを開いたとき、私はただちにバウンスすることなくO1イベントを受け取りたいと思っています。 – wilddev

+1

「バージョン管理」は、たとえば時間とともに使用できます。 Observable OイベントとObservable Eイベント(デバウンス前)をマップして、コンテンツと時間の両方を格納します。 Observable EイベントがObservable Oイベントよりも「古い」場合は、比較を行うことができます。 Observable.combineLatest oに移行する必要があります。 – krp

答えて

2

あなたは、新しいアイテムが観察源から放出された ある時はいつでも、それが解除と観測をミラーリング を停止することを除いてswitchMapは、多くのflatMapように振る舞う

Observable.merge(O, O.switchMap(o -> E.debounce())) 
      .subscribe() 

を試すことができます以前に発行されたアイテムの から生成され、現在のアイテムのみをミラーリングし始めます。

2

2つの主なオプションがあります。 1つは、十分に簡単なタイムスタンプを使用することですが、理論上の競合条件がありますが(おそらくほとんどないと思われます)、もう1つのオプションは、各ファイルオープンに関連付けられた一意の識別子を使用することです。ファイルオープンの識別子を伴います。タイムスタンプを使用して

obs = Observable.defer(() -> { 
    AtomicBoolean first = new AtomicBoolean(true); 
    e.timestamp() 
    .debounce(2000, TimeUnit.MILLISECONDS)) 
    .mergeWith(o.timestamp()) 
    .buffer(2,1) 
    .flatMap(list -> { 
    Observable<Object> start; 
    if (first.compareAndSet(true, false)) 
     start = Observable.just(list.get(0).getValue()); 
    else 
     start = Observable.empty(); 
    if (list.size() == 1) 
     return start; 
    else { 
     Timestamped<Object> a = list.get(0); 
     Timestamped<Object> b = list.get(1); 
     if (a.getTimestampMillis() <= b.getTimestampMillis()) 
     return start.concatWith(Observable.just(b.getValue())); 
     else 
     return start; 
    } 
    }) 
}); 

私はタイムスタンプ付きバージョンは十分でしょう疑い。

関連する問題