2013-01-12 12 views
7

मेरा आईओएस ऐप कई धागे के माध्यम से कोर डेटा का उपयोग करता है। मुझे निम्न संदेश के साथ कुछ क्रैश रिपोर्ट मिल रही हैं: "NSObjectInaccessibleException ', कारण:' CoreData '0x1e07a9b0' 'NSObjectInaccessibleException ', कारण:' CoreData एक गलती को पूरा नहीं कर सका

मुझे समझ में आता है कि इस समस्या का कारण क्या है - कि ऑब्जेक्ट हटा दिया गया था लेकिन एक और धागा इसे एक्सेस करने का प्रयास कर रहा है। मैं समस्या को हल करने के लिए काम कर रहा हूं लेकिन मैं पृष्ठभूमि थ्रेड में एक चेक जोड़ना चाहता हूं यह देखने के लिए कि क्या ऑब्जेक्ट इस तरह से गलती करेगा।

इस समय मेरा कोड myObject.myValue से संबंधित है। कुछ चेक करना संभव है, जैसे:

if (!myObject.myValue) { 
    return; 
} 

... ताकि यह टी से बाहर हो जाएगा वह ऐसा कुछ करने से पहले विधि है जो इस तरह के दुर्घटना का कारण बन सकता है? या बस myObject.myValue पर कॉल करेगा, यह देखने के लिए कि क्या यह शून्य है, ऐसे अपवाद को फेंकने का कारण बनता है?

+8

वैसे, आपके पास बहुत ही कम उत्तर स्वीकृति है जो संभवतः कोई भी आपके प्रश्नों का उत्तर देना नहीं चाहता है। कृपया अपने पुराने प्रश्नों की समीक्षा करने और प्रत्येक के लिए सही उत्तर चुनने पर विचार करें। http://stackoverflow.com/users/353137/jason?tab=questions – iwasrobbed

उत्तर

19

आप कोशिश करते हैं और existingObjectWithID:error: इस्तेमाल कर सकते हैं:

निर्दिष्ट आईडी के लिए वस्तु देता है।

- (NSManagedObject *)existingObjectWithID:(NSManagedObjectID *)objectID error:(NSError **)error 

चर्चा

अगर वहाँ है प्रदान की गई ID पहले से ही संदर्भ में पंजीकृत के साथ एक प्रबंधित वस्तु, उस वस्तु सीधे लौटा दिया जाता है; अन्यथा संबंधित वस्तु संदर्भ में गलती है।

यदि डेटा अनसुलझा है तो यह विधि I/O निष्पादित कर सकती है।

ऑब्जेक्ट के विपरीत: यह विधि कभी गलती नहीं देती है।

तुम कर सकते हो:

if ([myMOC existingObjectWithID:myObject.objectID error:&error]) 
    ... 
5

आप सत्यापित करना चाहिए कि वस्तु यह चर है आप मुद्दों जहां किसी चीज़ का एक और धागा पर हटाया जा सकता है आ रही है तो एक्सेस करने से पहले से मौजूद है।

दो तरीके:

  1. ताज़ा दृश्य datasources जब भी आपका डेटा हटाया जा रहा है। आप NSManagedObjectContextObjectsDidChangeNotification अधिसूचना के लिए पंजीकरण करके और फिर उस अधिसूचना पर userInfo को पार्स करके यह देख सकते हैं कि कौन सा ऑब्जेक्ट हटा दिया गया था।
  2. जब आप एकाधिक धागे के आसपास डेटा पास कर रहे हैं तो नीचे दिए गए कोड का उपयोग करें।

उदाहरण:

// Cache and pass the object's ID off to another thread to do work on 
// You can just store it as a property on the class 
@try { 
    NSManagedObject *theObject = [managedObjectContext objectWithID:self.theObjectID]; 

    // do stuff with object 
} 
@catch (NSException * e) { 
    // An entity with that object ID could not be found (maybe they were deleted) 
    NSLog(@"Error finding object: %@: %@", [e name], [e reason]); 
} 
+0

विधि # 1, निश्चित रूप से। मैं अपने "विस्तार" दृश्य (सिंक्रनाइज़ेशन के पहले/उसके दौरान सुलभ) पर अधिसूचनाओं का इंतजार कर सकता हूं और किसी भी कार्यक्षमता को अक्षम कर सकता हूं जो वस्तु के साथ इंटरैक्ट करता है, उपयोगकर्ता को सूचित करता है, आदि – Mark

0

आप देख सकते हैं [myObject isFault] जहां myObject एक NSManagedObject उदाहरण

+0

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

2

आप देख सकते हैं जब आप NSManagedObject का उपयोग NSManagedContext अस्तित्व में रहा है। इस तरह:

if (obj.managedObjectContext) 
{ 
    //do things 
} 
+0

मेरे पास एक ही विचार था, हालांकि मुझे इस व्यवहार की पुष्टि करने वाले कोई दस्तावेज नहीं मिल रहा है। क्या कोई पुष्टि कर सकता है कि यह जांचने का एक निश्चित तरीका है कि ऑब्जेक्ट अभी भी उपलब्ध है या नहीं? –

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