एक पर्यवेक्षक और एक सब्सक्राइबर के बीच अंतर क्या है?


85

मैं निम्नलिखित कार्य को समझने की कोशिश कर रहा हूं:

Subscription getCar(id, Observer<Car> observer) {
    return getCarDetails(id, new Observer<CarDetails> {
                             @Override
                             onNext(CarDetails details) {           
                                 observer.onNext(details.getCar());
                             } });
}

मुझे http://blog.danlew.net/2014/09/15/grokking-rxjava-part-1/ से rxjava के लिए एक अच्छा परिचय मिला, लेकिन यह केवल पास करने में ऑब्जर्वर का उल्लेख करते हुए कहता है कि आप सब्सक्राइबर का सबसे अधिक उपयोग करेंगे वेधशाला से उत्सर्जित उपभोक्ता वस्तुओं का समय।

क्या कोई मुझे समझा सकता है

  1. एक पर्यवेक्षक क्या है?
  2. कैसे एक पर्यवेक्षक एक ग्राहक से अलग है?
  3. उपरोक्त कोड स्निपेट क्या करता है?

Javadoc ने इसे केवल एक ग्राहक की तरह बनाया। ग्राहक के लिए javadoc का कहना है कि यह पर्यवेक्षक और सदस्यता को लागू करता है। मैं बहुत असमंजस में हूँ।


यह ऑब्जर्वर पैटर्न बनाम प्रकाशित / सदस्यता है । वे समान हैं, लेकिन सूक्ष्म अंतर हैं।
शॉन पैट्रिक फ्लोयड

4
@SeanPatrickFloyd: क्या आप अंतर समझा सकते हैं?
user541686

'विवरण' चर क्या है?
मैरियन पाडज़िओच

जवाबों:


65

संपादित : साथ @ Alrid की टिप्पणी

tl; डॉ

public abstract class Subscriber<T> implements Observer<T>, Subscription

तो एक सब्सक्राइबर ऑब्जर्वर का कार्यान्वयन है , सदस्यता पर अतिरिक्त शब्दार्थ के साथ (यह अन-सब्सक्रिप्शन के बारे में अधिक है)। आपके प्रश्न में कोड केवल यह दिखाता है कि यह Observerकार्यान्वयन (सामान्य प्रोग्रामिंग अभ्यास) के बजाय इंटरफ़ेस को पास करता है।

इसके अलावा यह कोड एक रिटर्न देता है Subscription, ऐसा इसलिए हो सकता है क्योंकि इस कोड के लेखक ने सोचा था कि ग्राहक को केवल Subscriptionतरीकों तक पहुंच होनी चाहिए , बिना पालन किए गए तत्वों के उपयोग के बिना। यह एक प्रोग्रामर त्रुटि हो सकती है।

लम्बी कहानी

वास्तव में आपको इस वेबसाइट (या पुस्तक) की सामग्री को पढ़ना चाहिए: http://www.introtorx.com यह Rx.Net के बारे में है, लेकिन अवधारणाएं बहुत समान हैं, वे एरिक मीजर द्वारा बनाए गए थे और RxJava कार्यान्वयनकर्ताओं ने उनका अनुसरण किया था ( अगर जावा भाषा पर लागू होता है)।

यह पृष्ठ आपको दिलचस्पी लेगा (यह दूसरा अध्याय है): कीटेप्स

यहाँ आप पहले पैराग्राफ में पढ़ेंगे:

आरएक्स के साथ काम करते समय समझने के लिए दो महत्वपूर्ण प्रकार हैं, और सहायक प्रकारों का एक सबसेट जो आरएक्स को अधिक प्रभावी ढंग से सीखने में आपकी सहायता करेगा। IObserver और IObservable Rx के लिए मौलिक बिल्डिंग ब्लॉक्स हैं, जबकि ISubject के कार्यान्वयन से Rx के लिए डेवलपर्स के लिए सीखने की अवस्था कम हो जाती है।

...

अनिवार्य रूप से आरएक्स को ऑब्जर्वर पैटर्न की नींव पर बनाया गया है। .NET पहले से ही ऑब्जर्वर पैटर्न को लागू करने के कुछ अन्य तरीकों को उजागर करता है जैसे मल्टीकास्ट डेलिगेट्स या इवेंट्स (जो आमतौर पर मल्टीकास्ट डेलिगेट्स हैं)।

भले ही प्रकार / एपीआई थोड़ा अलग हो, आप इस पुस्तक के साथ बहुत कुछ सीखेंगे, शायद कुछ ब्लॉगों की तुलना में अधिक।

यह पुस्तक क्या नहीं कहती है ( ... क्योंकि यह RxJava कार्यान्वयन में है )

RxJava मुख्य डेवलपर ने इस समय थोड़ी भिन्नता दिखाई (PR # 792 देखें ) जो दो प्रकार के अनुबंधों को अलग करने की अनुमति देता है:

  • सूचना -> Observer
  • (संयुक्त राष्ट्र) सदस्यता -> Subscription

इस परिवर्तन ने RxJava पुस्तकालय के कार्यान्वयन वर्गों की इन चिंताओं को बेहतर ढंग से व्यक्त / विभाजित करने की अनुमति दी।

हालाँकि, एक पुस्तकालय उपयोगकर्ता के रूप में, RxJava पुस्तकालय के वास्तविक कार्यान्वयन का उपयोग करना पर्याप्त होना चाहिए।

एक ग्राहक को लागू करने के लिए बहुत अधिक ज्ञान, काम और देखभाल की आवश्यकता होती है, वास्तव में सदस्यता योग्य शब्दार्थ बहुत महत्वपूर्ण होते हैं जो स्रोत के प्रकार पर निर्भर करते हैं (गर्म या ठंडा? महंगा बनाने के लिए?)


ऊपर के मामलों की Subscriberबजाय एक्सपोज़ करना Observerज्यादातर मामलों में कोड के साथ हस्तक्षेप नहीं करेगा, लेकिन जब तक कि उन सदस्यता वाले शब्दार्थों की आवश्यकता न हो, तब तक इसका उपयोग नहीं किया जाता है। लेकिन अंत में एक को लागू करने Subscriber, और कुछ नुकसान में शामिल हो सकते हैं जैसे:

  1. कार्यक्षमता के लिए संसाधन खर्च करें जो आप उपयोग नहीं करेंगे
  2. दूसरे वर्ग से विरासत में नहीं मिल सकता
  3. गलत संयुक्त राष्ट्र सदस्यता कोड लिखें
  4. एक अलग संदर्भ के लिए एक गलत कोड या सही कोड को कॉपी / पेस्ट कोड

1
2.x ऑब्जर्वर में एक ऑब्जर्वर को सब्सक्राइब करने के लिए उपयोग किया जाता है, और सब्सक्राइबर को फ़्लोएबल में सब्सक्राइबर के लिए उपयोग किया जाता है, सब्सक्राइबर अब ऑब्जर्वर, github.com/ReactiveX/RxJava-issues/4515 पर
सर्वेश चव्हाण

40

(संपादित करें: यह स्पष्ट रूप से RxJava 1. का केवल सच है)

  1. एक Observerवस्तु एक डेटा स्रोत (ए Observable) से डेटा प्राप्त कर सकती है । डेटा स्रोत प्रेक्षक के कॉल करने से डेटा को धक्का देता है onNext()

  2. Subscriberवह है जो Observerउस डेटा स्रोत ( Subscriptionइंटरफ़ेस के माध्यम से ) से भी सदस्यता समाप्त कर सकता है ।

  3. getCar()समारोह कारों वापस जाने के लिए कोशिश कर रहा है, लेकिन वहाँ है कि करने के लिए कोई सीधा तरीका है। लेकिन कार विवरण प्राप्त करने के लिए एक फ़ंक्शन है ( getCarDetails()) जो सभी कार विवरणों के साथ एक पर्यवेक्षक को बुलाएगा। तो यह उस फ़ंक्शन को कॉल करता है और इसे एक पर्यवेक्षक पास करता है, जब यह डेटा प्राप्त करता है, तो कार डेटा को विवरण से लेगा और इसे अपने स्वयं के पर्यवेक्षक को पास करेगा।


2
यह RxJava 2 के रूप में सच नहीं है, ग्राहक और पर्यवेक्षक दो पूरी तरह से अलग इंटरफेस हैं। न ही दूसरे का विस्तार करता है
FRR

19

RxJava 2 org.reactivestreams.Subscriber में प्रतिक्रियाशील धाराओं के विनिर्देशन का अनुपालन करने वाला एक इंटरफ़ेस है ।

इसमें से मुख्य अंतर Observableयह है कि नया Subscriberबैकस्पेस का समर्थन करता है।

Observerकी सदस्यता ली गई है Observable, और (लागू ) की Subscriberसदस्यता ली गई है ।Flowableorg.reactivestreams.Publisher

विस्तृत विवरण यहाँ देखें ।


3

इसके अलावा में RxJava2 , आपकी सदस्यता समाप्त करने के लिए, आप का उपयोग करना चाहिए सक्षम होना चाहते हैं, तो ResourceObserverके लिए Observableऔर ResourceSubscriberके लिए Flowable

इस प्रश्न की जाँच करें

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.