2013-01-21 13 views
8

नहीं है। यदि, बाद में, तो मैं इसेKVO फायरिंग जब मूल्य सौंपा विभिन्न

self.myValue = 2; 

केवीओ फिर से आग लग जाएगा। मैंने माना था कि उद्देश्य-सी में केवीओ आग नहीं लगाएगा यदि मूल्य आवंटित नहीं किया गया था। ऐसा प्रतीत होता है कि मैं गलत हूं।

क्या इस डिफ़ॉल्ट व्यवहार को बल देने का कोई तरीका है, यानी प्रत्येक बार मूल्य आवंटित किए जाने पर केवीओ अधिसूचनाओं को फायरिंग अक्षम करें? मैं अपने स्वयं के एक्सेसर्स बना सकता हूं, लेकिन अगर मैं बहुत सारी संपत्तियां बदलना चाहता हूं तो यह बहुत काम हो सकता है ...

किसी भी उत्तर के लिए धन्यवाद।

+0

यदि यह किसी कारण के लिए महत्वपूर्ण है कि एक विशेष सूचना केवल निकाल दिया जाता है जब जब मूल्य परिवर्तन , तो आपको या तो कस्टम सेटर लिखना होगा या इसे सेट करने से पहले मूल्य की जांच करनी होगी। यानी 'अगर (self.myValue! = 2) self.myValue = 2'। – lnafziger

+0

एक अच्छा सवाल है, और यह आश्चर्य की बात है कि यह कभी भी ऐप्पल डॉको में वास्तव में स्पष्ट नहीं हुआ है। – Fattie

उत्तर

13

केवीओ आग लगती है जब एक सेटर (या अन्य म्यूटेटर) कहा जाता है। कोई अतिरिक्त जांच नहीं है। आम तौर पर, केवीओ बेहद हल्का और प्रदर्शन संवेदनशील होता है। चूंकि अनावश्यक परिवर्तन आम तौर पर दुर्लभ होते हैं और अधिकांश मामलों में पर्यवेक्षक को हानिरहित, उनमें पुराने मूल्य की जांच करने के अतिरिक्त ओवरहेड शामिल नहीं होते हैं। पिछले मान की जांच करना महंगा हो सकता है, उदाहरण के लिए यदि किसी प्रबंधित ऑब्जेक्ट को दोष नहीं दिया गया है, तो इस मामले की जांच करने के लिए बहुत सारे काम करना डिफ़ॉल्ट व्यवहार नहीं है।

यदि आपको यह जांचने की आवश्यकता है कि मूल्य कैसे बदला गया या नहीं, तो आप NSKeyValueObservingOptionNew|NSKeyValueObservingOptionOld विकल्पों को पार करके पर्यवेक्षक के रूप में ऐसा कर सकते हैं। फिर आप नए और पुराने दोनों मूल्य प्राप्त करेंगे और आप तय कर सकते हैं कि उस जानकारी के साथ कुछ भी करना है या नहीं। मैंने अभ्यास में पाया है कि हालांकि, अक्सर इसकी आवश्यकता नहीं होनी चाहिए।

+1

हाँ, मैं NSKeyValueObservingOptionNew का उपयोग कर रहा हूं | NSKeyValueObservingOptionOld मान पहले से ही इस के आसपास पाने के लिए। यह कोई बड़ा सौदा नहीं है, मैं बस सोच रहा था कि ऐसा करने के लिए एक आसान और 'निर्मित' तरीका था या नहीं। चीयर्स! –

+0

मेरे पास बिल्कुल वही विचार थे, निएल। रॉब से पुष्टि सुनना अच्छा होता है कि, वास्तव में, सिस्टम एक संदेश भेजता है, भले ही वह मान जो सेट हो, वही है। सोचा, कुछ मामलों में, और यहां मेरा मतलब है कि प्रदर्शन के लिए पूरी तरह से मतलब है (दुर्लभ मामलों में जो मायने रखता है) "बेहतर भेजने" पर जांच करना बेहतर हो सकता है कि यह एक अपरिवर्तनीय मूल्य है (और इसलिए, इसे बस सेट न करें) "प्राप्त करने वाला अंत" पर जांच करने के बजाय (उदाहरण के लिए, यदि आपके पास बहुत से रिसीवर हैं और आप एक जटिल तुलना कर रहे हैं, एक स्ट्रिंग या जो भी हो)। धन्यवाद फिर से रॉब नेपियर। – Fattie

2
बस संदर्भ के लिए

, सेटर को यह तर्क जोड़ने के लिए (मैनुअल परिवर्तन सूचना का प्रयोग करके) आप का प्रयोग करेंगे:

- (void)setValue:(int)value 
{ 
    if (_value == value) return; 
    [self willChangeValueForKey:@"value"]; 
    _value = value; 
    [self didChangeValueForKey:@"value"]; 
} 

+ (BOOL)automaticallyNotifiesObserversOfValue { return NO; } 
+0

यह वही है जो मैं करता हूं! यह यहां प्रलेखित है: https://developer.apple.com/library/ios/documentation/Cocoa/Conceptual/KeyValueObserving/Articles/KVOCompliance.html#//apple_ref/doc/uid/20002178-SW1 – Klaas

+0

यह वही है जो मैं करता हूं, भी। संभावित रूप से बड़ी संख्या में रिसीवर में चेक दोहराए जाने से प्रदर्शन और रखरखाव के लिए बेहतर। –

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