2012-03-09 6 views
5

पर धक्का दिया जाता है (मुझे उम्मीद है कि यह एक बेवकूफ सवाल होगा, लेकिन इस समस्या के साथ कई घंटों तक कुश्ती के बाद मुझे कुछ अंतर्दृष्टि चाहिए।किसी बच्चे द्वारा किए गए परिवर्तन के दौरान इकाई का डुप्लिकेशंस प्रबंधित ऑब्जेक्ट कॉन्टेक्स्ट को अपने माता-पिता

मेरा आईओएस 5.1 ऐप ने नेस्टेड एमओसी का उपयोग किया है, जिसमें निजी क्यूई कोंकुरेंसी बच्चे एमओसी है, इसे एमओसी-चाइल्ड कहते हैं, जिसका माता-पिता मुख्य क्यूई कोंकुरेंसी एमओसी है, इसे एमओसी-पैरेंट कहते हैं। एमओसी-पैरेंट एक टेबल व्यू का समर्थन करता है जो इसकी इकाइयों को प्रदर्शित करता है।

एमओसी-चाइल्ड का उपयोग एक पार्सर द्वारा किया जाता है, जो गैर-मुख्य धागे पर असीमित रूप से चलता है, जो कि एक इकाई कनेक्शन से पार्स किए गए एक्सएमएल इकाई-विवरणों के अनुरूप नई इकाइयां बनाता है, और फिर नई इकाइयों को एमओसी- अभिभावक, एमओसी-चाइल्ड पर सहेजने के माध्यम से, जो उन्हें तालिका दृश्य में प्रदर्शित करता है। यह महान काम करता है:

1) Parser creates entity in MOC-Child 
2) Parser saves MOC-Child 
3) New entity is added to MOC-Parent 
4) New entity is displayed in MOC-Parent's table view 

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

यह वह जगह है जहां चीजें गलत होती हैं। मैंने सोचा था कि एमओसी-चाइल्ड में एक प्राप्त इकाई में किए गए परिवर्तन, जब इसे सहेजकर माता-पिता को धक्का दिया जाता है, तो एमओसी-अभिभावक में "समान" इकाई में बस "दिखाई दें"। हालांकि, मैं जो देख रहा हूं वह यह है कि एमओसी-चाइल्ड की बदलती इकाई को एमओसी-पैरेंट, में जोड़ा गया है, हालांकि यह पूरी तरह से अलग और नई इकाई थी; परिणाम के साथ एमओसी-जनक, और इस तरह तालिका देखें कि यह ड्राइव, हर संशोधित इकाई के लिए दो संस्थाओं के साथ समाप्त होता है:

1) Parser modifies existing entity in MOC-Child 
2) Parser saves MOC-Child 
3) Modified entity is _added to_ MOC-Parent 
4) Entity is displayed _twice_ in MOC-Parent's table view 

क्या देता है? एमओसी-पैरेंट में मौजूदा इकाई के मूल्यों को बदलने के लिए मुझे क्या करने की ज़रूरत है, अगर मैं इसे एमओसी-चाइल्ड के भीतर नहीं कर सकता? और अगर मुझे एमओसी-चाइल्ड के भीतर ऐसा करने में सक्षम होना चाहिए, तो एमओसी-चाइल्ड में बदलाव करने के लिए एमओसी-चाइल्ड को सहेजने के अलावा मुझे कुछ और करने की ज़रूरत है, बिना इकाई को दूसरी बार जोड़ने के?

किसी भी मदद या अंतर्दृष्टि के लिए अग्रिम धन्यवाद!

कार्ल

पी.एस. कुछ स्पष्टीकरण। जब मैं कहता हूँ कि बदली हुई इकाई एमओसी-जनक को जोड़ा जाता है, मेरा मतलब है कि NSFetchedResultsController कि एमओसी-जनक की निगरानी कर रहा है एक NSFetchedResultsChangeInsert परिवर्तन प्रकार जारी करता है ( एक NSFetchedResultsChangeUpdate परिवर्तन प्रकार का नहीं) बदली हुई इकाई के लिए, भले ही " वही "इकाई एमओसी-अभिभावक में पहले से मौजूद है।

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

+0

मुझे एक ही समस्या है। मेरे पास एक UIManagedDocument से नेस्टेड संदर्भों से जुड़ा एक NSFetchedResultsController है। मैं सिर्फ पृष्ठभूमि में अभिभावक पर एक सर्वर से लोड कर रहा हूं और फिर बच्चे को अग्रभूमि में दिखा रहा हूं। लेकिन यह ठीक से काम नहीं कर रहा है इससे कोई फर्क नहीं पड़ता। अगर मैं ऐप बंद करता हूं और फिर से खोलता हूं, तो यह पूरी तरह से स्मृति से लोड होता है। अजीब। –

उत्तर

1

मुझे कल्पना होगी कि, चूंकि यह एक पुराना सवाल है, अब यह कोई मुद्दा नहीं है। लेकिन जैसा कि मैंने हाल ही में खुद को इसी तरह की स्थिति के साथ कुश्ती पाया, मुझे लगा कि मैं अपना समाधान पेश करूंगा।

मैं एक एक्सएमएल फ़ाइल में हजारों ऑब्जेक्ट्स (जो एक या अधिक बारकोड से जुड़े हैं) को डाउनलोड करता हूं, जिसे मैं एनएसओपरेशन सबक्लास का उपयोग करके पृष्ठभूमि संदर्भ पर बैचों में पार्स और सेव करता हूं। डिस्क संदर्भ (लगातार स्टोर से जुड़ा हुआ) NSManagedObjectContextDidSaveNotification के लिए सुनता है, जिस बिंदु पर यह भी बचाता है (ब्लॉक में ऐसा करने के लिए याद रखें)।

[self.diskManagedObjectContext performBlockAndWait:^{ 
    NSError *error; 
    if (![self.diskManagedObjectContext save:&error]) { 
     NSLog(@"error saving to disk: %@",error); 
    } 
}]; 

मुश्किल बात यह है कि उन वस्तुओं 'बारकोड के किसी भी स्कैन किया जा सकता है (यूआई संदर्भ में) से पहले पूरी तरह से एक्सएमएल फ़ाइल पार्स किया गया है और जानकारी डेटाबेस में लोड है। और मेरे पास एक NSFetchedResultsController द्वारा समर्थित एक तालिका दृश्य है जो स्कैन किए गए ऑब्जेक्ट्स प्रदर्शित करता है, जो उनके शीर्षक में "अज्ञात" दिखाता है जब तक कि पृष्ठभूमि लोड से डेटा पुनर्प्राप्त नहीं किया जाता है। कार्ल की स्थिति की तरह, पृष्ठभूमि संदर्भ सहेजते समय इन वस्तुओं को अद्यतन करने की आवश्यकता होती है।

इसे संभालने के लिए, मैं यूआई संदर्भ और पृष्ठभूमि संदर्भ के साथ this question में एक जैसा तीन-संदर्भ प्रणाली का उपयोग करता हूं, जिनमें से दोनों मेरे मुख्य डिस्क संदर्भ (जो लगातार स्टोर से बंधे हैं) के बच्चे हैं। इसलिए, एक्सएमएल पार्सिंग के दौरान, मैं पृष्ठभूमि संदर्भ में ऑब्जेक्ट के बारकोड पर एक क्वेरी चलाता हूं (जो पैरेंट डिस्क संदर्भ से भी खींचता है) यह देखने के लिए कि उस ऑब्जेक्ट को पहले से ही उस बारकोड के साथ बनाया गया है या नहीं। यदि इसमें है, तो मैं केवल जानकारी अपडेट करता हूं, पुनः सहेजता हूं, डिस्क संदर्भ रीसेट करता है, और refreshObject: mergeChanges को कॉल करता हूं: UI संदर्भ से डिस्क संदर्भ से इन परिवर्तनों को खींचने के लिए। यह डुप्लीकेट बनाने के बिना तालिका को सफलतापूर्वक रीफ्रेश करता है।

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

मुझे लगता है कि महत्वपूर्ण सवाल यह है कि आप मौजूदा इकाई को कैसे संशोधित कर रहे हैं? और रीसेट को मत भूलना।

+0

दरअसल, मैंने अभी तक इस मुद्दे को हल नहीं किया है, इसलिए यह अभी भी मेरे लिए कम से कम वर्तमान है। (मैंने मुख्य धागे पर एक असीमित कार्य के रूप में पार्सिंग करके इस मुद्दे पर पंसद किया - बिल्कुल आदर्श से!) जब मुझे मौका मिलता है, तो मैं आपके समाधान को आजमाने के लिए अपनी पार्सिंग योजना का पुन: कार्य करूंगा। इस बीच, जानकारी के लिए धन्यवाद! –

+0

निश्चित बात। यदि आप इसे आज़माते समय अधिक जानकारी चाहते हैं, तो मुझे बताएं और मैं एक स्पष्टीकरण के बारे में थोड़ा अधिक विस्तृत जानकारी प्रदान करूंगा। – enjayem

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

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