पर काम करने से बदलकर मैं State
के विभिन्न कार्यान्वयन के लिए तर्क की एक अलग देखने योग्य श्रृंखला को संभालना चाहता हूं। इसे आसानी से एक सीलबंद वर्ग/बीजगणितीय डेटा प्रकार/संघ + .flatMap()
के साथ हासिल किया जा सकता है, लेकिन यह धारा को तोड़ता है, जहां .distinctUntilChanged()
जैसे ऑपरेटर केवल फ़ंक्शन के भीतर काम करते हैं, पूरे स्ट्रीम पर ही नहीं।.flatMap के बिना प्रवाह को नियंत्रित करने के लिए, जो एक धारावाहिक धारा को तोड़ता है जैसे ऑपरेटरों को अलग-अलग स्ट्रीम पर रोकता है, पूरे स्ट्रीम
sealed class State {
object Loading : State()
data class Loaded(val value: Int) : State()
}
@Test fun distinctTest() {
val relay = PublishRelay.create<State>()
relay.flatMap {
fun handle(state: State): Observable<*> = when (state) {
State.Loading -> Observable.just(state)
.distinctUntilChanged()
.doOnNext { println("loading") }
is State.Loaded -> Observable.just(state)
.distinctUntilChanged()
.doOnNext { println(it.value) }
}
handle(it)
}
.subscribe()
relay.accept(State.Loading)
relay.accept(State.Loaded(1))
relay.accept(State.Loaded(2))
relay.accept(State.Loaded(3))
relay.accept(State.Loaded(3))
//desired: loading, 1, 2, 3
//actual: loading, 1, 2, 3, 3
}
नोट, यह एक सरलीकृत उदाहरण है। जबकि मैं बस यहां प्रिंट कर रहा हूं, मैं वास्तव में कार्यान्वयन प्रकार State
पर आधारित विभिन्न कार्यों (यूआई को अलग-अलग प्रस्तुत करना) करना चाहता हूं, यह किसी विषय/रिले के साथ पूरा किया जा सकता है, लेकिन यह डिस्कनेक्ट हो जाएगा, उत्परिवर्तनीय धारा, जिसे मैं भी टालना चाहूंगा।
महान प्रश्न दोस्त! – Everett
क्या आपने 'रिले' के बगल में 'विशिष्ट यूटिल चंगेड' को स्थानांतरित करने पर विचार किया है: 'relay.distinctUntilChanged.flatMap ...'? –
@ m.ostroverkhov निश्चित रूप से, लेकिन यह मेरा उपयोग मामला नहीं है। पूरी धारा पर काम करने के लिए 'विशिष्ट UnttilChange' की आवश्यकता है। आपके सुझाव में 'flatUntilChanged' flatmap के भीतर परिचालन नहीं कर रहा है। मेरे उपयोग के मामले में दोनों ऑपरेशन का बहुत महंगा होगा – ZakTaccardi