2016-09-21 10 views
8

मैं दो observables है:RxJava debounced मर्ज और नहीं debounced observables

नमूदार हे (खुला): TextView में खोला कुछ सामग्री के साथ फ़ाइल

प्रत्यक्ष ई (संपादित): फ़ाइल सामग्री TextView में संपादित

मैं ई देखने योग्य को अस्वीकार करना चाहता हूं, और इसे ओ देखने योग्य के साथ विलय करना चाहता हूं। diagram

:

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

यह क्या चल रहा है का एक चित्र है:

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

कि अगर ई एक घटना E1 का उत्सर्जन करता है और सही है कि हे के बाद O1 घटना का उत्सर्जन करता है, हम उत्पादन किया है

इस अत्यधिक पुरानी घटना से छुटकारा पाने के लिए कैसे देखा जा सकता है?

+1

'विलय' कार्यकर्ता से 'विलय' ऑपरेटर को क्यों नहीं ले जायेगा? –

+0

@TassosBassoukos, ईवेंट संपादित करें (ई 1) बहुत बार होता है (वास्तव में यह एक महत्वपूर्ण टाइप की गई घटना है) इसलिए मैं इसे रद्द करना चाहता हूं। हालांकि जब मैं फ़ाइल खोलता हूं, तो मैं बिना किसी बहस के तुरंत ओ 1 ईवेंट प्राप्त करना चाहता हूं। – wilddev

+1

उदाहरण के लिए उदाहरण के लिए आप "वर्जनिंग" का उपयोग कर सकते हैं। सामग्री और समय दोनों को रखने के लिए अपने अवलोकन योग्य ओ और अवलोकन योग्य ई घटनाओं (debounce से पहले) मानचित्र करें। यदि आप अवलोकननीय ई इवेंट की तुलना में अवलोकननीय ई इवेंट "पुराना" है तो आप एक तुलना कर सकते हैं। आपको Observable.combineLatest o पर स्विच करने की आवश्यकता हो सकती है। – krp

उत्तर

2

आप

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

switchMap बर्ताव बहुत तरह flatMap, जब भी कोई नया आइटम स्रोत प्रत्यक्ष द्वारा उत्सर्जित होता है सिवाय इसके कि, यह करने के लिए सदस्यता समाप्त करने और प्रत्यक्ष मिरर बंद हो जाएगा कोशिश कर सकते हैं जिसे से पहले से उत्सर्जित आइटम से उत्पन्न किया गया था, और केवल वर्तमान को मिरर करना शुरू कर देता है।

2

मैं दो मुख्य विकल्प देखें। एक टाइमस्टैम्प का उपयोग करना है जो काफी आसान है लेकिन सैद्धांतिक दौड़ की स्थिति (लेकिन अनुमानित बहुत संभावना नहीं है) और दूसरा विकल्प प्रत्येक फ़ाइल खोलने से जुड़े एक अद्वितीय पहचानकर्ता का उपयोग करना है और उस खुली फ़ाइल के पाठ में संपादन से उत्सर्जित घटनाएं हैं फ़ाइल खोलने के पहचानकर्ता के साथ।

का उपयोग timestamps:

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

मुझे लगता है टाइमस्टैंप संस्करण पर्याप्त होगा।