2016-09-21 11 views
8

debounced ve birleştirme textview açılan bazı içerikle dosyaRxJava İki gözlenebilirleri var debounced gözlenebilirleri

Gözlemlenebilir E (edit): textview düzenlenebilir dosya içeriği

Gözlemlenebilir E'yi geri almak ve gözlemlenebilir O ile birleştirmek istiyorum. diagram

: Bu ne olup bittiğini bir diyagram

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

geçerli:

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

sorun E bir etkinlik E1 yayar ve bu doğru O sonra O1 olayı yayar, biz çıkışı olması

Bu aşırı eski olaydan nasıl kurtulabilirsiniz?

+1

"Bağımlılık" işlecini niçin "birleştirme" işinden çıkarmıyorsunuz? –

+0

@TassosBassoukos, Düzenleme olayı (E1) çok sıktır (aslında bir tuşla yazılan olaydır) Bu yüzden onu geri almak istiyorum. Ancak dosyayı açtığımda, hemen çıkmadan bir O1 olayı almak istiyorum. – wilddev

+1

"Sürüm oluşturma" özelliğini örneğin zaman ile kullanabilirsiniz. Hem içeriği hem de zamanı içerecek şekilde Gözlemlenebilir O ve Gözlemlenebilir E olaylarını (geri alınmadan önce) eşleyin. Sonra Gözlemlenebilir E olayı, Gözlemlenebilir O olayından "eski" ise, bir karşılaştırma yapabilirsiniz. Bu Observable.combineLatest o acheive için geçiş yapmanız gerekebilir. – krp

cevap

2

Sen

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

switchMap, yeni madde Gözlemlenebilir kaynak tarafından yayılan her haricinde, bu aboneliğinden ve gözlemlenebilir yansıtma duracak kadar flatMap gibi davranır deneyebilirsiniz Bu, daha önce yayılmış olan öğesinden oluşturuldu ve yalnızca geçerli olanı yansıtmaya başlıyor.

2

İki ana seçenek görüyorum. Biri yeterince kolay zaman çizelgeleri kullanmaktır, ancak teorik yarış koşulları vardır (ama tahmin edilemeyecek kadar muhtemel) ve diğer seçenek her bir dosya açılışıyla ilişkili benzersiz bir tanımlayıcı kullanmaktır ve düzenlemelerden yayılan olaylar bu açılmış dosyanın metnine gönderilir. dosya açılışı tanımlayıcısı ile birlikte.

kullanma damgaları:

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

Ben Timestamped versiyonu yeterli olacaktır sanıyorum.