2012-05-14 8 views
5

हमने कोर डेटा के साथ बातचीत के लिए एक रिपोजिटरी परत बनाई है जिसमें allItems(), addItem:(Item*)item जैसी विधियां हैं जहां आइटम NSManagedObject subclass है। जब हमें किसी आइटम को सहेजने की आवश्यकता होती है तो हम उप-वर्ग उदाहरण को एक तर्क के रूप में पास करने वाले भंडार पर विधि का आह्वान करते हैं। हालांकि, यह काम नहीं करता है क्योंकि हम init प्रारंभकर्ता का उपयोग नहीं कर सकते हैं और संदर्भ भंडार के अंदर छिपा हुआ है।कक्षाओं के बीच NSManagedObject उपclass कैसे परिवहन?

आपके पास आर्किटेक्चर होने पर ऑब्जेक्ट्स को स्थानांतरित करने का सबसे अच्छा तरीका क्या है? एक आइटम डीटीओ को एक विकल्प के आसपास गुजर रहा है? या ऐसे हल करने के बेहतर तरीके हैं जैसे उप-वर्गीकृत NSManagedObject का उपयोग न करें और केवल उस कुंजी/मान का उपयोग करें जो काम करता है।

+0

क्या आप अपनी समस्या को थोड़ा आगे समझा सकते हैं? क्या आपकी समस्या है कि आप रिपोजिटरी परत के बाहर नई प्रबंधित ऑब्जेक्ट्स नहीं बना सकते हैं, या आप ऑब्जेक्ट्स को बाद में सहेज नहीं सकते हैं? – jrturton

+0

समस्या यह है कि संदर्भ भंडार परत के अंदर "छिपी हुई" है और मैं भंडार परत के बाहर इसे रिसाव नहीं करना चाहता हूं। मैं इसे अमूर्तता के ठोस बिंदु के रूप में उपयोग करना चाहता हूं। – LuckyLuke

+1

आप जानते हैं कि प्रत्येक प्रबंधित ऑब्जेक्ट में प्रबंधित ऑब्जेक्ट संदर्भ के लिए एक सूचक है? तो कि विशेष बिल्ली बैग से बाहर है, तरह। – jrturton

उत्तर

1

I ने एक नमूना प्रोजेक्ट की प्रतिलिपि बनाई जो मॉडल कस्टम कक्षाओं से संदर्भ छुपाता है: branch 10583736

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

आप संदर्भ उजागर बिना दुकान परत के लिए एक वर्ग को परिभाषित कर सकते हैं:

@interface DataStore : NSObject 

+ (id)shared; 

- (void)saveAll; 
- (NSEntityDescription *)entityNamed:(NSString *)name; 
/* more custom methods ... */ 
- (NSManagedObject *)fetchEntity:(NSEntityDescription *)entity withPredicate:(NSPredicate *)predicate; 

@end 

मैं कुछ टाइपिंग को बचाने के लिए अपने सभी कस्टम मॉडल वर्गों के लिए एक आम पूर्वज उपयोग करने के लिए सुझाव देते हैं। यह कक्षा केवल एक ही हो सकती है जो सीधे DataStore से बातचीत करती है। इसके पास संदर्भ तक पहुंच नहीं है।

@interface Card : DataObject 

@property (nonatomic, retain) NSString * question; 
@property (nonatomic, retain) NSString * answer; 
@property (nonatomic, retain) Deck *deck; 

/* return a new card */ 
+ (Card *)card; 

/* more custom methods ... */ 

@end 

मास्टर शाखा एक अधिक सामान्य दृष्टिकोण जहां मॉडल वर्गों प्राप्त होते हैं:

@interface DataObject : NSManagedObject 

+ (NSString *)entityName; 
+ (NSEntityDescription *)entity; 
- (void)save; 
/* more custom methods ... */ 

@end 

अंत में अपने मॉडल कस्टम कक्षाओं कोई भी तरीका आप शायद जो कुछ भी सुपर क्लास द्वारा प्रदान की जाती है का लाभ लेने की जरूरत को परिभाषित करता है संदर्भ और इसके साथ काम करते हैं।

3

आमतौर पर, आप NSManagedObject सबक्लास बनाने वाले नियंत्रकों को NSManagedObjectContext पर पॉइंटर रखने के लिए चाहते हैं। इस तरह, आप वास्तव में प्रारंभकर्ता को कॉल कर सकते हैं।

आप जो करने की कोशिश कर रहे हैं उसके साथ समस्या यह है कि आइटम संदर्भ के बिना मौजूद नहीं हो सकते हैं। यह जानबूझकर किया जाता है ताकि कोर डेटा जानता है कि क्या आप किसी नई वस्तु या किसी ऑब्जेक्ट के बारे में बात कर रहे हैं जो पहले से ही लगातार स्टोर में है।

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

याद रखें कि NSManagedObjectContext एक दृढ़ता अबास्ट्रक्शन परत है और यदि आप चाहें तो आप इसे अन्य custom ones समेत अन्य लगातार स्टोर कार्यान्वयन के साथ वापस कर सकते हैं।

5

मैं कहूंगा कि आप जिस आर्किटेक्चर का उपयोग कर रहे हैं वह मूल डेटा के अनुकूल नहीं है। इसका उपयोग जारी रखने के लिए (जो आपको करना चाहिए) आपको दो चीजों में से एक करना है। मुझे लगता है कि आपकी "रिपोजिटरी लेयर" को सिंगलटन के रूप में कार्यान्वित किया गया है, या कम से कम नई प्रबंधित वस्तुओं को बनाने वाली वस्तुओं तक पहुंच है।

  • अपने ऑब्जेक्ट संदर्भ को अन्य ऑब्जेक्ट्स के लिए एक्सपोज़र करें, आमतौर पर आपके रिपोजिटरी परत पर एक संपत्ति के रूप में।
  • क्या आपकी रिपोजिटरी परत प्रारंभ होती है और आपके लिए ऑब्जेक्ट्स लौटाती है। इसमें किसी इकाई नाम में गुजरना और उपयुक्त इकाई प्रकार या कक्षा का एक नया प्रबंधित ऑब्जेक्ट प्राप्त करना शामिल होगा।

यदि आप खुद को ढांचे से लड़ते हैं और अत्यधिक अवशोषण के साथ आते हैं, तो आप इसे गलत कर रहे हैं।

+0

अंतिम विकल्प अच्छा था, धन्यवाद! बहुत चालाक – LuckyLuke

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