2009-08-09 10 views
11

अमान्य कर दिया गया है मेरे पास एक बग है जिसे मैं ट्रैक करने के लिए संघर्ष कर रहा हूं। मेरा मानना ​​है कि क्या हो रहा है कि मैं अंतर्निहित डेटाबेस से ऑब्जेक्ट हटा रहा हूं, जबकि एक अन्य प्रबंधित ऑब्जेक्ट संदर्भ (किसी अन्य थ्रेड में) उस पर एक गलती है और जब यह गलती को पूरा करने का प्रयास करता है तो 'NSObjectInaccessibleException' प्राप्त करता है।NSObjectInaccessibleException डीबगिंग - आईडी के साथ NSManagedObject ID: 0x123456789 को

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

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

+0

जिम, तुम क्यों मेरे iPhone टैग खाई था कि मैं बदलकर बस तय? मैं आईफोन पर काम कर रहा हूं इसलिए मेरे पास कोरडाटा बाइंडिंग नहीं है। –

+0

रोजर - मैंने आईफोन टैग वापस रख दिया। लेकिन यह वास्तव में एक सामान्य कोर डेटा समस्या है जो डेस्कटॉप या मोबाइल प्लेटफॉर्म पर हो सकती है। –

+0

इसलिए मैंने इसका निदान किया है और यह एक आईफोन समस्या है हालांकि कहीं भी हो सकता है। –

उत्तर

1

समाधान सफाई और this mapkit bug का संयोजन था। मेरे NSManagedObjectContext को जारी करने के बाद एक नक्शा दृश्य अपने प्रतिनिधि को पकड़ रहा था। मैपकिट ने प्रतिनिधि को एक एनोटेशन के समन्वय के लिए कहा और मेरे प्रतिनिधि ऑब्जेक्ट ने एक ऑब्जेक्ट से पूछने की कोशिश की जो जारी किए गए संदर्भ में था (जेसन की समस्या के समान)।

फिक्स जेक के ब्लॉग पोस्ट में वर्णित है - जब आप मानचित्र दृश्य के साथ समाप्त हो जाते हैं तो प्रतिनिधि को शून्य पर सेट करें।

+0

लिंक टूट गया है। क्या आपके पास नया है, या आप समझा सकते हैं? – bearMountain

+0

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

+0

धन्यवाद। – bearMountain

1

दूसरा संदर्भ क्या होता है जब यह लगातार स्टोर से हटाए गए ऑब्जेक्ट में गलती करने का प्रयास करता है?

यह एक बग की तरह लगता है जिसमें 2 भाग हो सकते हैं: आप अपने सहकर्मी संदर्भ से परिवर्तन विलय नहीं कर रहे हैं, और आपके पास एक तर्क बग है जो आपको थ्रेड बी में किसी ऑब्जेक्ट का उपयोग करने का कारण बन रहा है जिसे थ्रेड ए में हटा दिया गया है

आमतौर पर आप -[NSManagedObjectContext mergeChangesFromContextDidSaveNotification:] का उपयोग कर एक सहकर्मी संदर्भ से परिवर्तन मर्ज करना चाहते हैं।

+0

मुझे लगता है कि यहां दो बग हैं और मैं उनसे सहमत हूं :-(मुझे जो चाहिए वह उन्हें ट्रैक करने का एक तरीका है। –

+0

क्या आप अपने सहकर्मी संदर्भों में परिवर्तन विलय कर रहे हैं? डीबगिंग उद्देश्यों के लिए जब भी कोई संदर्भ हो तो आप हटाए गए ऑब्जेक्ट लॉग कर सकते हैं बचाया गया है। यदि आप जानते हैं कि अन्य सभी मौजूदा संदर्भ क्या हैं, तो आप उन संदर्भों के साथ पंजीकृत वस्तुओं की भी जांच कर सकते हैं, लेकिन आपको थ्रेड सुरक्षित तरीके से ऐसा करना होगा। –

+1

आप सही हैं। मैंने फैसला किया कि मैं इस दोष को हल करने के लिए पूरी थ्रेडिंग स्थिति को ठीक करने की आवश्यकता है। यह छोटा नहीं है लेकिन शायद मेरे स्वास्थ्य के लिए अच्छा है। –

7

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

मेरे मामले में, संदर्भ एक "खरोंच" संदर्भ था जो दृश्य बंद होने पर दूर चला गया। हालांकि, मेरे पास पृष्ठभूमि की नौकरी थी कि दृश्य उत्पन्न हुआ था जो वस्तु को अद्यतन करना चाहता था।

मैं प्रबंधित ऑब्जेक्ट के लिए एक एक्सेसर बनाना समाप्त कर दिया जो [प्रबंधित ऑब्जेक्ट isFault] सत्य था जब शून्य वापस लौटा। फिर मेरे कोड में मैं यह सुनिश्चित करने के लिए उस एक्सेसर चयनकर्ता के मूल्य की जांच कर रहा था कि मेरे पास काम करने के लिए एक वैध वस्तु थी (कहें कि मेरी पृष्ठभूमि नौकरी ने आखिरकार अपना काम पूरा कर लिया था)।

मैं कोर डेटा के लिए काफी नया हूं, इसलिए ऐसा करने के लिए शायद एक बेहतर/स्मार्ट तरीका है, लेकिन मुझे लगता है कि यह मेरे लिए मुद्दा तय करता है।

+0

जेसन, इसे मेरे ध्यान में लाने के लिए धन्यवाद। मैंने हाल ही में अपनी त्रुटि तय की है यह सफाई और मैपकिट - मानचित्र का संयोजन था विचार उनके प्रतिनिधि को बहुत लंबा रखते हैं। आपके मामले में, आपको शायद पृष्ठभूमि थ्रेड से उसी NSMAnagedObject संदर्भ तक नहीं पहुंचना चाहिए - कोरडाटा थ्रेड-सुरक्षित नहीं है। आपको अपने पृष्ठभूमि कार्य में एक NSManagedObjectReference पास करना चाहिए। –

+0

हाँ, आप निश्चित रूप से सही हैं। मेरे मामले में मैं वस्तु को वास्तव में संपादित करने से पहले मुख्य धागे (जहां मैं सभी संदर्भ बनाते हैं) पर वापस कूद रहा था, लेकिन यह तब भी अच्छा नहीं है जब इसका संदर्भ अलविदा हो गया हो। – Jason

+1

यह "एनएसएमएनेज ऑब्जेक्ट रिफरेंस" क्या है जिसके बारे में आप बात करते हैं? दस्तावेज़ों के अनुसार मौजूद नहीं है ... – Adam

2

मुझे अभी भी इस मुद्दे का सामना करना पड़ा। मैंने डेटा के थोक आयात के लिए ऐप्पल के "ढूंढें या बनाएं" पैटर्न का पालन करने के लिए कुछ रिफैक्टरिंग किया। मैंने आयात के लिए समर्पित एक नया संदर्भ बनाया, जैसा कि सुझाव दिया गया है कि अंडरमेनर को शून्य के रूप में सेट करें। तो:

// create a new special context for the bulk import of data 
NSManagedObjectContext *importContext = [[NSManagedObjectContext alloc] init]; 
[importContext setPersistentStoreCoordinator:_persistentStoreCoordinator]; 

// avoid tracking for undo/redo operations 
[importContext setUndoManager:nil]; 

तो मैं एक fetchRequest डेटाबेस में संग्रहित वस्तुओं की आईडी पुन: प्राप्त करने के लिए बनाया है, और आयात पाश अंदर मैं अगर यह पुनः प्राप्त आईडी की सरणी के अंदर निहित था खोजने के लिए वस्तु की आईडी का परीक्षण ... समस्या यह थी कि किसी दिए गए अंतराल पर मैं importContext को सहेज रहा था और इसे रीसेट कर रहा था। और चूंकि मैंने डिफ़ॉल्ट रूप से importContext के बजाय गलत कॉन्टेक्स्ट का जिक्र किया है, तो मुझे यह त्रुटि मिलती है।

साथ
NSArray *storedObjects = [importContext executeFetchRequest:checkRequest error:&fetchError]; 

:

NSArray *storedObjects = [defaultContext executeFetchRequest:checkRequest error:&fetchError]; 
+8

आईओएस उपयोगकर्ताओं के लिए बस थोड़ा सा नोट नोट। आईओएस पर 'undoManager' संपत्ति डिफ़ॉल्ट रूप से 'nil' है। – stigi

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