2010-09-16 15 views
18

मेरे पास कस्टम NSManagedObject सबक्लास है, कहें, Person। मेरे पास -addObserver:forKeyPath:options:context: के साथ Person के विभिन्न गुणों का निरीक्षण करने के लिए पंजीकृत है, जिनमें से कुछ "नाम" की तरह लगातार हैं और अन्य सिर्फ "पीने" जैसे कोर डेटा से संबंधित केवीओ-अनुपालन एक्सेसर्स हैं।NSManagedObject और केवीओ बनाम प्रलेखन

@interface Person : NSManagedObject 
{ 
    BOOL drinking; 
} 
@property (nonatomic, retain) NSString* name; 
@property (nonatomic, readonly) BOOL drinking; 
@end 

@implementation Person 
@dynamic name; 
... 
- (void) getDrunk { 
    [self willChangeValueForKey: @"drinking"]; 
    drinking = YES; 
    [self didChangeValueForKey: @"drinking"]; 
} 
... 
@end 

सब कुछ काम करता है। जब भी मैं -getDrunk भेजता हूं या name संपत्ति सेट करता हूं, तो दृश्य को अधिसूचित किया जाता है। मैं छोड़कर जब मैं NSManagedObject डॉक्स पढ़ा एक खुश आदमी हूँ जो राज्य:

+ (BOOL)automaticallyNotifiesObserversForKey:(NSString *)key 

तथ्य 1. हाँ अगर रिसीवर कुंजी-मान कुंजी के लिए परिवर्तन अधिसूचना के अवलोकन के लिए स्वत: सहायता प्रदान करता है, अन्यथा नहीं।

तथ्य 2. एनएसएमएनेज्ड ऑब्जेक्ट के लिए डिफ़ॉल्ट कार्यान्वयन मॉडलिंग गुणों के लिए डी नहीं, और अनमोल गुणों के लिए हाँ।

अब मैं दस्तावेज़ों से उपरोक्त दो तथ्यों को पार्स करने के लिए कड़ी मेहनत कर रहा हूं। तथ्य 2 की जांच करना आसान है और कक्षा व्यक्ति वास्तव में @ "नाम" और @ "पीने" के लिए हाँ देता है। लेकिन फिर, नाम बदलते समय दृश्य को कैसे सूचित किया जाता है? और didChangeValueForKey: KVO डॉक्स स्पष्ट रूप से कहते हैं,

स्वत: पर्यवेक्षक अधिसूचना का उपयोग करना, यह willChangeValueForKey के आमंत्रण के साथ एक संपत्ति के लिए ब्रैकेट परिवर्तन करने के लिए आवश्यक नहीं है जब मुख्य मान कोडिंग और मुख्य मान अनुरूप तरीकों कोडिंग के माध्यम से गुण परिवर्तनशील।

तो, अगर व्यक्ति @ "नाम" के लिए +automaticallyNotifiesObserversForKey: से नहीं देता है, यह प्रतीत होता है मैं मैन्युअल will/didChangeValueForKey: में नाम सेटर रैप करने के लिए KVO काम करने के लिए किया है। हालांकि, केवीओ काम करता है ठीक। मैं क्या खो रहा हूँ? NSManagedObject के ओवरराइडिंग +automaticallyNotifiesObserversForKey: में क्या बात है और यदि यह मानक केवीओ व्यवहार को बदलता प्रतीत नहीं होता है तो इसे दस्तावेज करना क्या है?

कृपया, मेरी स्वच्छता प्राप्त करने में मेरी सहायता करें।

+2

महान प्रश्न;) – Colas

उत्तर

16

अच्छा, NSManagedObjectname संपत्ति (साथ ही - name और - setName: विधियों) के लिए कार्यान्वयन प्रदान करता है। मुझे लगता है कि कोर डेटा द्वारा प्रदान किए गए कार्यान्वयन में willChangeValueForKey: और didChangeValueForKey: पर कॉल शामिल हैं।

इसलिए, भले ही KVO आप इसे काम करने के लिए कुछ भी करने को नहीं था कि "स्वचालित" अर्थ में है, मैं कल्पना होगा कि यह इस अर्थ में कि willChangeValueForKey: और didChangeValueForKey: कहा जा रहा है में स्वत: नहीं है NSManagedObject में विधियों द्वारा जो गतिशील संपत्ति कार्यान्वयन प्रदान करते हैं।

+2

आपकी व्याख्या समझ में आता है। आपका बहुत बहुत धन्यवाद! – Costique

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