2015-07-08 20 views
10

Diyelim ki her an değer yayabilecek iki sonsuz Gözlemcim var. Bir Observable<ProcessFileEvent> oluşturmak için birleştirirler.RxJava- CombineLatest ama sadece bir Gözlenebilir emisyon için ateş mi?

Observable<Integer> selectedFileId= ... 
Observable<MouseClick> buttonClick = ... 

Observable<ProcessFileEvent> `processFileEvent` = Observable.combineLatest(selectedFileId, buttonClick, (s,b) -> { 
    //create ProcessFileEvent here 
}); 

sorun buttonClickselectedFileId şey değil yayar zaman sadece processFileEvent yayarlar istemeniz. Bir kullanıcı bir dosya kimliği girildiğinde beklediği davranış değildir ve ProcessFileEvent'u başlatır. Nasıl birleştiririm, ancak yalnızca buttonClick yayarken yayar?

cevap

3

MouseClick nesnesinde .distinctUntilChanged() kullanın. Bu şekilde, yalnızca MouseClick değiştiğinde olaylar alırsınız.

static class FileMouseClick { 
    final int fileId; 
    final MouseClick mouseClick; 

    FileMouseClick(int fileId, MouseClick mouseClick) { 
     this.fileId = fileId; 
     this.mouseClick = mouseClick; 
    } 
} 

Sonra

Observable.combineLatest(selectedFileId, buttonClick, 
         (s,b) -> new FileMouseClick(s,b)) 
    .distinctUntilChanged(f -> f.mouseClick) 
    .map(toProcessFileEvent()) 
+0

Bu mantıklıdır. Bir hızlı soru. Yayımlanan her öğe için '(') '' ('' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' 'yazıyor mu? – tmn

+1

bir HashSet dahili olarak kullanılır. MouseClick için hashCode()/equals() öğesini uyguladıysanız, istediğiniz şey daha iyi olur. Onları uygulamamışsanız, o zaman sadece nesne referansı eşitliğini kullanacaktır. Ah, bu fazla mesai, distinctUntilChanged kullanmamız gerektiğini fark ettim. Güncelleme yapacağım. –

+0

Bu distinctUntilChanged kullanıldığında, HashSet kullanılmıyor ama equals() yöntemi farklı kontrol için kullanılıyor, böylece hala istediğiniz gibi davranarak hashCode()/equals() 'a ihtiyacınız var. –

1

Bunu yapmak için Observable.Join kullanabilirsiniz. Ben neler yapabileceğini

Ancak

, bu pencereleri bir zamanlar ikinci bir değer ben ilk değerini görmek artık olurdu üretildiğini yüzden, bu binen değil mi emin olmak için: Bu paragrafın özel önem Öde? Sol diziyi leftDurationSelector'dan döndürürsek, bu hile yapabilir. Ama bekle, biz solDurationSelector'dan sola döndürdüğümüzde, başka bir abonelik oluşturmak ve yan etkileri ortaya çıkarabilmek için 'u deneyebiliriz. Bunun hızlı cevabı, sol diziyi Yayınla ve Yeniden Sırala seçeneğidir. Bunu yaparsak, sonuçlar buna daha çok benziyor. selectedFileId sol dizisidir ve buttonClick sağ dizisidir mermer diyagramı istediğini Yani

left |-0-1-2-3-4-5| 
right |---A---B---C| 
result|---1---3---5 
      A B C 

.

13

kullanın withLatestFrom: Sadece zaman ilk ObservablebuttonClick yayar ile yayar

Observable<Integer> selectedFileId= ... 
Observable<MouseClick> buttonClick = ... 

Observable<ProcessFileEvent> processFileEvent = buttonClick.withLatestFrom(selectedFieldId, (b,s) -> { 
    //create ProcessFileEvent here 
}); 

hem fileId ve mouseClick içeren bir sınıf oluşturun.

+0

Bu, OP'nin sorusunu tam olarak yanıtladığı için cevaplanmış bir cevap olmalıdır. –

İlgili konular