2009-09-03 13 views
18

यह एक आईफोन ऐप के लिए है, लेकिन मुझे नहीं लगता कि वास्तव में मायने रखता है। मुझे आईफोन की गेमकिट का उपयोग करके ब्लूटूथ पर एक कस्टम ऑब्जेक्ट (जिसे कोर डेटा द्वारा प्रबंधित किया जाता है) भेजने की आवश्यकता है। आम तौर पर, मैं ऑब्जेक्ट को डेटा ऑब्जेक्ट के रूप में पैकेज करने के लिए एनएसकेड आर्चिवर का उपयोग करता हूं और इसे लाइन पर भेजता हूं, फिर ऑब्जेक्ट को अनारक्षित करता हूं और मैं कर रहा हूं। बेशक, मुझे initWithCoder को कार्यान्वित करने की आवश्यकता होगी: और एन्कोड WithCoder: मेरी कस्टम ऑब्जेक्ट में विधियां भी।क्या मैं NSManagedObject के उप-वर्ग को एन्कोड कर सकता हूं?

मुझे यकीन नहीं है कि यह एनएसएमएनेज्ड ऑब्जेक्ट क्लास के साथ किया जा सकता है, जिसे कोर डेटा द्वारा प्रबंधित किया जाता है या नहीं। क्या वे एक साथ अच्छा खेलेंगे? मैं अनुमान लगा रहा हूं कि एक बार जब मैं एन्कोडेड प्रबंधित ऑब्जेक्ट को अन्य डिवाइस पर भेजता हूं और इसे अनएकोड करता हूं, तो मैं इस प्राप्त ऑब्जेक्ट को अन्य डिवाइस के संदर्भ में जोड़ दूंगा। क्या ये सही है? क्या मुझे कोई कदम याद आ रहा है?

उत्तर

27

एक NSManagedObject उदाहरण सार्थक एक NSManagedObjectContext उदाहरण के बाहर मौजूद नहीं कर सकते, तो मैं सीधे को क्रमानुसार और एक NSManagedObject दोनों के बीच संदर्भों deserialize करने के लिए आवश्यक NSCoding नृत्य करने के लिए कोशिश कर परेशान नहीं हैं (आप यह कर सकते हैं, नीचे देखें) । इसके बजाय मैं उपयुक्त विशेषता कुंजी/मानों के साथ एक शब्दकोश बनाउंगा (आप instance.entity.attributesByName.allKeys के माध्यम से प्रबंधित ऑब्जेक्ट इंस्टेंस के विशेषता नामों के माध्यम से विशेषता नाम प्राप्त कर सकते हैं (आप विशेषता का शब्दकोश प्राप्त करने के लिए [instance dictionaryWithValuesForKeys:keys] का उपयोग कर सकते हैं: मूल्य जोड़े)। मैं रिश्ते की जानकारी भेजूंगा NSURL -encoded NSManagedObjectIDs। शब्दकोश में managedObjectID (NSURL के रूप में) को शामिल करने के लिए मत भूलना ताकि आप किसी भी रिश्ते को से दूसरी ओर ऑब्जेक्ट को फिर से कनेक्ट कर सकें। आपको इन शब्दकोशों को रिकर्सिव रूप से बनाना होगा उदाहरण के लिए रिश्तों के किसी भी लक्ष्य के लिए आप एन्कोडिंग कर रहे हैं।

फिर तारों में तनों को भेजें और उन्हें दूसरे प्रबंधित पर एक नए प्रबंधित में उदाहरण दें ऑब्जेक्ट संदर्भ (आप setValuesForKeysWithDictionary: का उपयोग कर सकते हैं)।

आप देख सकते हैं कि यह ठीक है NSCoder प्रणाली आप के लिए क्या करेंगे, को छोड़कर आप classForCoder, replacementObjectForCoder: और एक कस्टम NSDictionary उपवर्ग सभी NSManageObject -to- NSDictionary मानचित्रण को संभालने के लिए और वीजा के साथ awakeAfterUsingCoder: का उपयोग करना होगा विपरीत। यह कोड मेरे अनुभव में, इसके लायक होने की तुलना में अधिक परेशानी है, जब तक कि आपके पास जटिल/गहरी ऑब्जेक्ट ग्राफ़ न हो जिसे आप क्रमबद्ध करने का प्रयास कर रहे हैं। किसी भी रिश्ते के साथ NSManagedObject उदाहरण के लिए, केवल एक निर्देश में रूपांतरण करना और खुद को वापस करना आसान है।

+0

मुझे यह वही समस्या थी, और बैरी ने सुझाव दिया कि मैं ठीक काम करता हूं - यह ठीक काम करता है। – jeff7091

+0

एनएस डिक्शनरी के बजाए यह भी ठीक होगा, मेरे पास सिर्फ मेरे एनएसएमएजेडऑब्जेक्ट के साथ एक समान मॉडल होगा? और वहां मैपिंग करूँगा? – bluezald

+0

क्या कोई यह बता सकता है कि एनएसआरएल-एनकोडेड एनएसएमएनेज ऑब्जेक्टिड्स रिश्तों के लिए सहायक कैसे है? धन्यवाद! –

2

मैं सरल विकल्पों के लिए शब्दकोश समाधान का सुझाव देता हूं। हालांकि, यहां इस मुद्दे को हल किया गया है। मेरा मॉडल पहले से ही बड़े और मजबूत था, कस्टम कक्षाओं और NSManagedObject से ऊपर एक एकल रूट वर्ग के साथ। [super initWithEntity:insertIntoManagedObjectContext:]:

सभी है कि मैं था कि एकल वर्ग उचित नामित प्रारंभकर्ता NSManagedObject की कॉल करने के लिए के लिए आवश्यक

। यह विधि, और NSEntityDescription में मेटाडेटा सभी डायनामिक एक्सेसर्स के कार्यान्वयन को सेट करता है।

- (id)initWithCoder:(NSCoder *)aDecoder { 
    CoreDataStack *cds = [LibraryDiscoverer unarchivingCoreDataStack]; 
    NSEntityDescription *entity = [cds entityDescriptionForName:[[self class] entityName]]; 
    NSManagedObjectContext *moc = [cds managedObjectContext]; 
    self = [super initWithEntity:entity insertIntoManagedObjectContext:moc]; 
    self.lastEditDate = [aDecoder decodeObjectForKey:@"lastEditDate"]; 
    return self; 
} 

CoreDataStack कोरडाटा के आसपास मेरा अमूर्त है। कोर डेटा जानकारी प्राप्त करने के लिए LibraryDiscoverer वैश्विक पहुंच हुक है। entityName कक्षा नाम से इकाई नाम प्रदान करने के लिए परिभाषित एक विधि है; यदि आप नामकरण सम्मेलन का पालन करते हैं (यानी वर्ग का नाम = इकाई का नाम) इसे सामान्य रूप से कार्यान्वित किया जा सकता है।

मेरी कक्षा पदानुक्रम में अन्य सभी initWithCoder: विधियां मानक NSCoder हैं, इस नोट के साथ कि आपको रिश्ते के दोनों दिशाओं को एन्कोड करने की आवश्यकता नहीं है, कोरडाटा आपके लिए इसे दोबारा जोड़ता है। (जैसा कि यह हमेशा करता है, शब्दकोश समाधान के साथ भी।)

+0

अच्छा समाधान। जब आप दो ढेर होते हैं तो आप इसका प्रबंधन कैसे करेंगे? मैं वर्तमान में ऐसे एप्लिकेशन पर काम कर रहा हूं जो नेटवर्क पर एप्लिकेशन के किसी अन्य उदाहरण से संचार करता है। मेरे परीक्षण लक्ष्य में मेरे पास एक यूनिट परीक्षण है जो संचार का परीक्षण करता है। इस स्थिति में, मुझे दो अलग-अलग ढेर की जरूरत है। आपने ऊपर दिए गए उदाहरण के साथ संयोजन में इसे कैसे हल किया? –

+0

मैं वास्तव में अनारक्षित करने के लिए एक नया, अनूठा ढेर बना देता हूं, फिर संदर्भ को सहेजता हूं (मुख्य स्टैक उस और अपडेट को सुनता है), फिर आयात करने वाले ढेर को हटा दें। - - - * * एनएससीओडर की मैपिंग रख सकता है -> यदि आप जटिल 'अनारक्षित करना चाहते हैं तो कॉरडाटास्टैक फॉरकोडर: (एनएससीओडर *) डिकोडर' – bshirley

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