2012-07-04 12 views
18

जहां एक पृष्ठभूमि बच्चे धागा (जिसकी मूल मुख्य यूआई धागा संदर्भ है) और बचत का कारण बनता है पर एक नई वस्तु बनाने मैं वर्तमान में समस्या हो रही है मेरी NSFetchedResultsController दो नई वस्तुओं को दिखाने के लिए: एक अस्थायी objectID के साथ, और एक के साथ एक स्थायी objectID। यह किसी प्रकार का बग प्रतीत होता है, जब तक कि मुझे कुछ याद नहीं आ रहा है।कब प्राप्त करने के लिए जब PowerPermanentIDsForObjects :?

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

मैं obtainPermanentIDs अनुमान लगा रहा हूँ सही दिशा में एक कदम है। लेकिन मैं इस विधि को कब कहूं? बाल संदर्भ में सहेजने से पहले? बच्चे को बचाने और माता-पिता के सामने? माता-पिता के बाद?

masterMOC - private queue tied to the persistent store, so physical saves happen here 
----mainMOC - main queue tied to the UI, child of masterMOC 
-------backgroundMOC - private queue, child of mainMOC 

तो अगर मैं backgroundMOC पर एक नई वस्तु बनाने, और मैं डिस्क के लिए बचाने के लिए (जिसका अर्थ है मैं बचाने फोन करना होगा: सभी तीन संदर्भों पर) immediatly करने का इरादा: वर्तमान में मेरे सेटअप यह है, जहां क्या मुझे obtainPermanentIDs पर कॉल करना चाहिए?

(या अगर किसी को भी एक अलग स्थायी आईडी प्राप्त बुला के अलावा अन्य समाधान है क्या समस्या इस विधि वैसे भी हल करने के लिए शुरू की क्यों मैं इस विधि कॉल करना चाहते हैं होता था??)

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

  1. बचाने backgroundMOC पर (ताकि परिवर्तन mainMOC को एक स्तर ऊपर धकेल दिया जाता है और मेरे तालिका दृश्य नई पंक्तियाँ सम्मिलित कर सकते हैं)
  2. बचाने mainMOC पर
  3. masterMOC को बचाने के लिए (जो अंत में डिस्क के लिए बचाता है) (ताकि मैं डिस्क के लिए बचाने के लिए तैयार कर सकते हैं)

कि backgroundMOC पर बचाने बुला एक यूआई अद्यतन ट्रिगर और कारण बनता है क्या यहाँ क्या हो रहा है है एक नई ऑब्जेक्ट डालने के लिए परिणाम परिणाम नियंत्रक जो अभी भी चालू है एक अस्थायी आईडी ly लेकिन फिर मास्टरएमओसी पर सहेजने के लिए कॉल करने से सभी ऑब्जेक्ट स्थायी आईडी असाइन किए जाते हैं, जो एक और यूआई अपडेट का कारण बनता है, इस "नई" ऑब्जेक्ट के लिए एक और पंक्ति डालने का कारण बनता है! अंतिम मास्टर एमओसी सेव करने पर टिप्पणी करके, अब मैं डुप्लिकेट प्रविष्टियां नहीं देखता हूं। क्या मैं यहाँ कुछ गलत कर रहा हूं, या यह किसी तरह की बग है?

एक और अद्यतन: मुझे लगता है कि मैंने बग की काफी पुष्टि की है। मैं पृष्ठभूमि एमओसी पर सहेजता हूं और फिर 5 सेकंड बाद मुख्य एमओसी और मास्टरएमओसी पर कॉल करने के लिए टाइमर सेट करता हूं। पृष्ठभूमि एमओसी को सहेजने पर Immediatley, मेरी तालिका में एक नई पंक्ति डाली गई है। 5 सेकंड बाद (मुख्य और मास्टर को बचाने पर), एक और नई पंक्ति डाली जाती है। (पंक्ति में डाली गई पंक्ति में एक अस्थायी आईडी है, और नवीनतम डालने में स्थायी आईडी है)।

उत्तर

11

मैं पता लगाने के लिए इस मुद्दे को अस्थायी आईडी था सब कुछ डिबगिंग की एक विशेष रूप से कठिन और dispiriting दिन के बाद निश्चित रूप से ठीक उसी मुद्दा, था।:)

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

मेरी RFSImportContext उपवर्ग में (अपने backgroundMOC के बराबर), मैं - save: लागू [super save:] कॉल करने के लिए है, तो फोन [self.parentContext performBlock:] (यहाँ self.parentContext अपने mainM के बराबर है) सी, जहां ब्लॉक कॉल मुख्य संदर्भ के की सामग्री के साथ obtainPermanentIDsForObjects:- updatedObjects और - insertedObjects सरणी, फिर मैं मुख्य संदर्भ को सहेजता हूं।

मेरे वर्णन के अनुसार मेरे पास अब मेरे NSFetchedResultsController में अस्थायी वस्तुओं का लीक नहीं है। स्थिति को बेहतर बनाने का एक तरीका स्थायी ऑब्जेक्ट आईडी प्राप्त करने के लिए - save: को लागू करने के लिए RFSMainContext सबक्लास (फिर से, अपने मुख्य एमओसी के बराबर) का उपयोग करना होगा, स्वयं को सहेज लें, फिर मास्टर संदर्भ को सहेजें। यह उस व्यवहार को संहिताबद्ध करता है जिसे हम हमेशा मुख्य संदर्भ में सहेजते समय वस्तुओं के लिए स्थायी आईडी रखना चाहते हैं।

+2

आपकी टिप्पणी ने किसी भी तरह मेरी मदद की लेकिन किसी अन्य तरीके से। मैं एक NSFetchedresultscontroller का उपयोग कर रहा था और यह अस्थायी आईडी के साथ ही स्थायी हो रहा था। तो हर बार जब नियंत्रक कॉल किया गया था, तो मैं एक प्राप्त करता हूं PermanentIDsForObjects: सभी fetched ऑब्जेक्ट्स के लिए और यह अब पूरी तरह से काम करता है! –

+0

@ JoãoNunes अभी भी मेरे लिए काम नहीं कर रहा है, मेरे आईडी पहले से ही स्थायी हैं और यह त्रुटि अभी भी –

+0

को संकेत दे रही है कि आपके पास किस प्रकार की त्रुटि है? –

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