2016-04-27 6 views
5

आरएक्स के कार्यान्वयन BehaviorSubject<T> और Variable<T> प्रदान करते हैं जो मॉडलिंग गुणों के लिए तंत्र के रूप में समय के साथ बदलते हैं (सी # INotifyPropertyChanged के लिए एक उपयोगी प्रतिस्थापन)।क्या आरएक्स में केवल एक व्यवहार सिब्जेक्ट इंटरफेस मौजूद है और यदि नहीं, तो क्या यह एक बुरा विचार है?

आम तौर पर इन Observable<T> के रूप में संपर्क में हैं लेकिन यह की तरह कुछ के रूप में गुण का पर्दाफाश करने के लिए और अधिक उपयोगी होगा:

class ObservableValue<T> : Observable<T>{ 
    var currentValue:T { get } 
} 

इस तेजी में इन पंक्तियों के साथ बनाया जा सकता है:

class ObservableValue<Element> : ObservableType { 

    typealias E = Element 

    private let subject:BehaviorSubject<E> 

    var currentValue:E { 
     get { 
      return try! subject.value() 
     } 
    } 

    init(subject:BehaviorSubject<E>) { 
     self.subject = subject 
    } 

    func subscribe<O: ObserverType where O.E == E>(observer: O) -> Disposable { 
     return self.subject.subscribe(observer) 
    } 

}

क्या यह पहले से मौजूद है? और यदि ऐसा नहीं है क्योंकि यह आरएक्स के उद्देश्य के खिलाफ है?

इसके आस-पास एकमात्र तरीका एक अलग वर्तमान वैल्यू का पर्दाफाश करना है या उपभोक्ताओं को लिखना है जो उजागर वेधशाला के पीछे ठोस कार्यान्वयन मानते हैं, एक बेहेविरसब्जेक्ट या श्रृंखला में कहीं एक रीप्ले() होता है उदा।

class MyViewModel { 
    // 'I will notify you of changes perhaps including my current value' 
    myProperty:Observable<String> 
} 

तो कोड के रूप में अगर अपनी 'अतुल्यकालिक' लिखा होना चाहिए है एक अंतर्निहित धारणा के साथ लगभग एक में कार्य करेगा: निम्नलिखित स्निपेट यह स्पष्ट है कि जैसे ही मैं सदस्यता मैं एक मूल्य मिल जाएगा नहीं है तुल्यकालिक ढंग के बजाय:

class MyViewModel { 
    // 'I have a current value and will notify you of changes going forward' 
    myProperty:ObservableValue<String> 
} 

उत्तर

1

यह सोचा से अधिक है और यह चर्चा की थोड़ी अधिक शायद कारण यह (और शायद अस्तित्व में नहीं होना चाहिए) नहीं है कि यह लाजि़मी पहुँचा राज्य के एक परिचय है करने के बाद।

राज्य को बनाए रखने के अन्य तंत्र (जैसे कि scan) 'मृत अंत' प्रत्यक्ष कॉल जैसे 'मुझे अभी मूल्य दें' के बजाय जंजीर अवलोकनों की सीमाओं के भीतर ऐसा करते हैं।

शायद यह एक संकर प्रतिक्रियाशील/अनिवार्य दृष्टिकोण में होगा, लेकिन यह प्रतिक्रियाशील शैली के पूर्ण गले लगाने में बाधा डाल सकता है।

यह आधे कोड में वादे या कार्यों का उपयोग करने के समान है और फिर अन्य भागों में सिंक्रोनस अवरुद्ध कोड पर वापस लौटना है।

0

ज्यादातर मामलों में लोग एक मानक दृश्य मॉडल बनाते हैं जो INotifyPropertyChanged के माध्यम से गुणों का खुलासा करता है। यह यूआई तत्वों को उनसे जुड़ने और संपत्ति परिवर्तन घटनाओं को प्राप्त करने और यूआई को सिंक में रखने की अनुमति देता है।

फिर यदि आप कहा संपत्ति के लिए IObservable चाहते हैं तो आप मानक आरएक्स ऑपरेटरों का लाभ उठाते हैं जो ईवेंट को IOervervable में बदल देते हैं। आप कई अलग-अलग कार्यान्वयन खोजने के लिए इसे Google पर कर सकते हैं। आप आमतौर पर इन अवलोकनों को उन चीज़ों से बनाते और उपभोग करते हैं जो दृश्य मॉडल को सीधे मॉडल मॉडल पर प्रदर्शित करने के बजाय देख रहे हैं।

+0

यह आरएक्स.नेट में काम करेगा क्योंकि आपके पास INotifyPropertyChanged है लेकिन तेजी से आप नहीं (निकटतम केवीओ है जो केवल एनएसओब्जेक्ट उप-वर्गों पर है)। मुझे यह भी यकीन नहीं है कि मुझे एक गेट/सेट, एक इंटोटिफाप्रॉपर्टी चेंज और एक अवलोकन करने योग्य व्यक्ति को उजागर करने का विचार पसंद है - अगर मैं व्यूमोडेल बना रहा हूं, तो मैंने इसे इवेंट सिस्टम के बजाए अवलोकन के साथ सीधे क्यों नहीं बनाया है। – Cargowire

संबंधित मुद्दे