2011-09-13 18 views
6

मेरे पास NSManagedObject सबक्लास MyClass एक संपत्ति myProp है, जिसे @dynamic परिभाषित किया गया है। [myClass myProp] के माध्यम से, मेरे कोड में myProp पढ़ने के कई उदाहरण हैं।उद्देश्य-सी: डायनामिक गेटर ओवरराइड

अब, मैं [myClass myProp] के लिए विभिन्न कॉल बदले बिना, एक गेटर (कि myProp रिटर्न यह करने के लिए कुछ जोड़कर बाद) myProp के लिए निर्धारित करना चाहते हैं। यानी एक गेटटर बनाने के बिना जिसे getMyProp के अलावा कुछ और नाम दिया गया है।

मेरा सवाल यह है कि, यदि मैं एक गेटर getMyProp बनाता हूं, जो NSManagedObject द्वारा बनाए गए गेटर को ओवरराइड करेगा, तो मैं डेटाबेस में संग्रहीत मूल मान को कैसे एक्सेस करूं?

धन्यवाद,

अक्षय

उत्तर

17

एक प्रबंधित वस्तु आपको निम्न दो विधियों का उपयोग के अंतर्निहित मूल्यों पहुंचने के लिए:

- (id)primitiveValueForKey:(NSString *)key

- (void)setPrimitiveValue:(id)value forKey:(NSString *)key

इस बार करने के लिए प्रयोग किया जाता है NSNumber विशेषताओं को उनके 'असली' प्रकार में परिवर्तित करें, उदाहरण के लिए एक बूल प्रॉपर्टी:

- (BOOL)isShared 
{ 
    [self willAccessValueForKey:@"isShared"]; 
    NSNumber *underlyingValue = [self primitiveValueForKey:@"isShared"]; 
    [self didAccessValueForKey:@"isShared"]; 
    return [underlyingValue boolValue]; 
} 

willAccessValueForKey: और didAccessValueForKey: दोष और रिश्तों आदि

और यदि आप एक सेटर लेखन खत्म करते हैं, आप भी KVC तरीकों में एक्सेसर लपेट चाहिए निपटने के लिए अंतर्निहित प्रबंधित वस्तु वर्ग के लिए आवश्यक हैं:

- (void)setShared:(BOOL)isShared 
{ 
    NSNumber *newUnderlyingValue = [NSNumber numberWithBool:isShared]; 
    [self willChangeValueForKey:@"isShared"]; 
    [self setPrimitiveValue:newUnderlyingValue forKey:@"isShared"]; 
    [self didChangeValueForKey:@"isShared"]; 
} 

यह कहकर, मैं व्यक्तिगत रूप से आपको एक ही विधि नाम रखने की सलाह नहीं देता जब तक आपके पास कोई अच्छा कारण न हो। 'व्युत्पन्न' मानों के लिए आप आमतौर पर एक अलग नाम के साथ एक ब्रांड नई विधि बनाना चाहते हैं। आपके कोड में त्वरित खोज/प्रतिस्थापन करने में लंबा समय नहीं लगता है।

संपादित करें: जोड़ा willAccessValueForKey:/didAccessValueForKey: (धन्यवाद jrturton)

+0

आप भी 'willAccessValueForKey के साथ अपने गेटर कोड ब्रैकेट की जरूरत है: और' 'didAccessValueForKey:' सुनिश्चित करना है कि दोष यदि आवश्यक हो तो निकाल दिया जाता है? – jrturton

+0

हाँ धन्यवाद, मुझे याद आया, मैंने कोड अपडेट किया। –

+0

धन्यवाद बहुत माइक! – Akshay

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