2011-01-28 18 views
5

मुझे कोर डेटा में एक क्षणिक संपत्ति स्थापित करने में समस्या हो रही है। जिस समस्या को मैं हल करने की कोशिश कर रहा हूं वह है: मेरे पास कोर डेटा का उपयोग करके सफलतापूर्वक संग्रहीत वस्तुओं का संग्रह है। यह संग्रह अनिवार्य रूप से केवल पढ़ने के लिए संग्रह है लेकिन रन-टाइम पर, मैं संग्रह में प्रत्येक आइटम के साथ एक और ऑब्जेक्ट (इस मामले में एक UIImage) को जोड़ना चाहता हूं। मुझे UIImages स्टोर करने की आवश्यकता नहीं है; यह पूरी तरह से एक रन-टाइम एसोसिएशन है। तो मुझे वास्तव में जो चाहिए वह संग्रह में प्रत्येक ऑब्जेक्ट में 'प्लेसहोल्डर' है जहां मैं बाद में यूआईएममेज को छोड़ सकता हूं।कोर डेटा और क्षणिक गुण

एक क्षणिक विशेषता सही बात और, इस के लिए की तरह लगता है, कोर डाटा संदर्भ डॉक्स ने मुझे बताया कि मैं डाटा मॉडल में एक "प्रकार अपरिभाषित के वैकल्पिक, क्षणिक विशेषता" जो मैंने किया है की स्थापना करना चाहिए: XCode snippet

आगे, यह मुझे बताता है कि मुझे कार्यान्वयन ऑब्जेक्ट में संबंधित संपत्ति को परिभाषित करने की आवश्यकता नहीं है, लेकिन मुझे कस्टम एक्सेसर & सेटर विधियों को लिखना होगा।

- (void)setDisplayImage:(UIImage *)anImage { 

    [self willChangeValueForKey:@"displayImage"]; 
    [self setPrimitiveValue:anImage forKey:@"displayImage"]; 
    [self didChangeValueForKey:@"displayImage"]; 
} 

और: इस प्रकार मैं डॉक्स में उदाहरण के आधार पर इन तरीकों मॉडल किया है

- (UIImage *)displayImage { 

    [self willAccessValueForKey:@"displayImage"]; 
    UIImage *anImage = [self primitiveDisplayImage]; 
    [self didAccessValueForKey:@"displayImage"]; 

    if (anImage == nil) {  
     NSData *displayImageData = [self displayImageData]; 
     if (displayImageData != nil) { 
      anImage = [NSKeyedUnarchiver unarchiveObjectWithData:displayImageData]; 
      [self setPrimitiveDisplayImage:anImage]; 
     } 
    } 
    return anImage; 
} 

वहाँ भी एक आस्थगित "लिखने" विधि (willSave) है कि मैं सख्त के लिए लिखा है है पूर्णता हालांकि, उपरोक्त के रूप में, मैं कभी भी इन वस्तुओं को स्टोर करने के लिए कभी नहीं लिखूंगा।

मुझे जो समस्या मिल रही है वह आदिम डिस्प्ले इमेज और सेटप्रिमिट डिस्प्ले इमेज विधियों - (UIImage *) displayImage {। असल में, कंपाइलर इन दो विधियों पर चेतावनी फेंकता है क्योंकि "ऑब्जेक्ट एक्स 'primitiveDisplayImage' का जवाब नहीं दे सकता है।" आदि हालांकि, दस्तावेज़ों से मेरी समझ यह है कि ये आदिम एक्सेसर्स/सेटर्स स्वचालित रूप से बनाए जाते हैं - ऐसा प्रतीत नहीं होता है मामला बनो कोई भी व्यक्ति जो इस मुद्दे को हल करने में मेरी मदद कर सकता है? बहुत धन्यवाद

उत्तर

5

setPrimitive... विधियों के साथ समस्या यह है कि हालांकि NSManagedObject रनटाइम पर उनका जवाब देगा, कंपाइलर के पास यह जानने का कोई तरीका नहीं है कि वे मौजूद हैं। आप एक श्रेणी का उपयोग करके अपनी इकाई वर्ग की शीर्षलेख फ़ाइल में विधि घोषित करके चेतावनी संदेशों को दबा सकते हैं ताकि संकलक आपके कार्यान्वयन में इसे परिभाषित न करने के लिए चिल्लाए।

एक और विकल्प केवल उन सभी विशेषताओं के लिए [self setPrimitiveValue:value forKey:@"key"]; पर कॉल करने का उपयोग कर रहा है, जिन्हें आपको एक्सेस करने की आवश्यकता है। मैंने अतीत में इस विधि का उपयोग किया है, हालांकि मैंने अभी दस्तावेज़ों में ध्यान दिया है कि यह 10.5 और बाद में निराश है।

3

यहाँ मिले जवाब: Managed Object Accessor Methods

असल: श्रेणी में हेडर फाइल @propery घोषित, श्रेणी में कार्यान्वयन फ़ाइल @dynamic परिभाषित करते हैं।