2011-08-06 11 views
6

हमें थोड़ी देर में "कोरडाटा एक गलती पूरी नहीं कर सका" मिलता है। हमने ऐप्पल दस्तावेज के माध्यम से पढ़ा है लेकिन यह बरकरार है कि इसे बनाए रखने की अनुमति क्या है। हम एक धागा प्रति संदर्भ बनाने के बारे में बहुत सावधान रहे हैं, आदि। हालांकि, एक चीज हमारे ऐप कर रही है कि हम अपने UIViewControllers (आमतौर पर एनएसएआरएआरई या एनएस डिक्शनरी के माध्यम से) पर एनएसएमएनेज्ड ऑब्जेक्ट्स को बनाए रखते हैं। मैं अनुमान लगा रहा हूं कि क्या हो रहा है यह है कि वस्तु संबंध बदल रहे हैं और हम उचित अधिसूचना को संभालने में काम नहीं कर रहे हैं।हम कैसे रोक सकते हैं "CoreData कोई गलती नहीं कर सका"?

क्या किसी को कोर डेटा के संबंध में बेहतर डिज़ाइन पर कोई सुझाव है? जब हमें त्रुटि मिलती है, तो मैं नहीं देख सकता कि हमने वास्तव में गलती के कारण संदर्भ से कुछ भी हटा दिया है। यदि वे राज्य को बनाए रखते हैं तो हमारे UIViewControllers पर NSManagedObjectContextObjectsDidChangeNotification को संभालना आवश्यक है? किसी भी सुझाव की सराहना की जाएगी।

+1

हमारे पास एक ऐसा दृश्य था जिसे रिलीज़ नहीं किया जा रहा था, जिसे हटा दिए जाने के बाद एनएसएमएनेज ऑब्जेक्ट्स के संदर्भ थे। खोजने के लिए बहुत मुश्किल है। – tjg184

उत्तर

5

आप कोर डेटा में परिवर्तन अधिसूचनाओं के लिए पंजीकरण कर सकते हैं। यह आपको बदलते समय अपनी प्रबंधित वस्तुओं को अपडेट करने की अनुमति देगा। अधिक जानकारी के लिए कोर डेटा डॉक्स देखें। आप रजिस्टर और परिवर्तन करने के लिए प्रतिक्रिया करने के लिए 2 तरीकों में रुचि हो जा रहे हैं:

[NSNotificationCenter defaultCenter] addObserver:self 
              selector:@selector(mergeChanges:) 
               name:NSManagedObjectContextDidSaveNotification 
              object:(your NSManagedObjectContext)]; 

mergeChanges चयनकर्ता (अपने विधि) अन्य थ्रेड से कोई भी परिवर्तन सिंक्रनाइज़ करने के लिए निम्न विधि कॉल करेंगे। यह इस तरह कुछ दिखाई देगा:

- (void)mergeChanges:(NSNotification *)notification{ 
    AppDelegate *appDelegate = [[UIApplication sharedApplication] delegate]; 
    NSManagedObjectContext *context = [appDelegate managedObjectContext]; 

    // Merge changes into the default context on the main thread 
    [context performSelectorOnMainThread:@selector(mergeChangesFromContextDidSaveNotification:) 
          withObject:notification 
         waitUntilDone:YES]; 
}