केवीओ गुणों के लिए कस्टम सेटर्स के साथ सही ढंग से काम करेगा; एनएसओब्जेक्ट-व्युत्पन्न कक्षाओं के लिए यह हमेशा मामला रहा है। रनटाइम मशीनरी प्रासंगिक सेटर विधि के आविष्कार की तलाश करती है, और सेटटर को निष्पादित करने से पहले "willChangeValueForKey" को स्पष्ट रूप से कॉल करती है, फिर सेटर पूर्ण होने के बाद निहित रूप से "didChangeValueForKey" को कॉल करता है।
यदि आप केवीओ अधिसूचनाओं पर अधिक सुदृढ़ नियंत्रण चाहते हैं तो आप इस स्वचालित व्यवहार को अक्षम कर सकते हैं। जैसा ऊपर बताया गया है, केवल वही गुण जिनके मूल्य आप बैकिंग इवर को संशोधित करके बदलते हैं, या जिनके मूल्य गणना द्वारा व्युत्पन्न होते हैं, वे स्थान हैं जहां आप मैन्युअल सूचनाओं का उपयोग करेंगे (हालांकि एक तंत्र है, keyPathsAffectingValueFor, जहां आप रनटाइम बता सकते हैं कि किसी संपत्ति का मूल्य किसी अन्य संपत्ति के परिवर्तन पर निर्भर होता है, और यह परिवर्तन अधिसूचना को उपयुक्त के रूप में भेज देगा।) प्रति-संपत्ति के आधार पर स्वचालित व्यवहार को अक्षम करने के लिए, आप स्वचालित रूप से कक्षा विधि + (BOOL) डालते हैं NotifiesObserversOf और वापस नहीं ।
मैं अक्सर स्वचालित केवीओ अधिसूचनाओं को अक्षम करता हूं, क्योंकि मुझे पता चला है कि एक सेटर का आह्वान करते समय एक केवीओ अधिसूचना उत्पन्न होती है, भले ही संपत्ति का मूल्य उसके वर्तमान मूल्य (जैसे कोई परिवर्तन नहीं) के समान सेट किया जा रहा हो। मैं दक्षता की खातिर व्यर्थ अधिसूचना को दबाने के लिए चाहते हैं:
+ (BOOL)automaticallyNotifiesObserversOfMyProperty
{
return NO;
}
- (void)setMyProperty:(NSInteger)myProperty
{
if(_myProperty != myProperty)
{
[self willChangeValueForKey:@"myProperty"];
_myProperty = myProperty;
[self didChangeValueForKey:@"myProperty"];
}
}
एक अच्छी चर्चा NSKeyValueObserving.h शीर्षक में पाया जा सकता है, कि आप Cmd + विधि के नाम "willChangeValueForKey" और "didChangeValueForKey पर क्लिक करके नेविगेट कर सकते हैं "एक्सकोड में।
स्रोत
2013-08-08 20:04:13
आपको बहुत बहुत धन्यवाद! – Frost
मैं एक ही मुद्दे पर भाग गया। ऐप्पल से केवीओ पर कुछ और है http://developer.apple.com/library/ios/#documentation/cocoa/conceptual/KeyValueObserving/KeyValueObserving.html#//apple_ref/doc/uid/10000177i – Dan