2011-10-25 26 views
12

मैं अपने ऐप में निम्न त्रुटि हो रही है:कोर डाटा: बयान अभी भी सक्रिय है

CoreData: error: Serious application error. Exception was caught during Core Data change processing. This is usually a bug within an observer of NSManagedObjectContextObjectsDidChangeNotification. statement is still active with userInfo (null)

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

मैंने कहीं पढ़ा है कि '-com.apple.CoreData.ThreadingDebug 3' का उपयोग करके 'बहु-थ्रेडिंग दावे को सक्षम करना' संभव है, लेकिन मैं इसे काम करने में सक्षम नहीं हूं। क्या किसी को पता है कि यह संभव है? मैं उम्मीद कर रहा था कि इससे कुछ दावे हो सकते हैं जो मुझे यह जानने में मदद करेंगे कि मैं गलत धागे या किसी संदर्भ के संदर्भ में कहां खेल रहा हूं।

क्या हो रहा है या इस तरह की समस्या को ट्रैक करने के तरीके पर कोई अन्य संकेत?

+1

क्या मेरा उत्तर मदद मिली? –

+0

आपने पढ़ा है कि [टीएन 2124: मैक ओएस एक्स डिबगिंग मैजिक] (https://developer.apple.com/library/ios/#technotes/tn2004/tn2124.html#SECCOREDATA)। कुंजी बिट है, "इस सुविधा को ढांचे के डीबग संस्करण की आवश्यकता है।" यदि आपके पास वह संस्करण था, तो आप पर्यावरण चर 'DYLD_IMAGE_SUFFIX = _debug' सेट कर सकते हैं और यह ढांचे के लिए' कोरडाटा 'की बजाय 'CoreData_debug' लोड करेगा। दुर्भाग्यवश, वे वेरिएंट केवल ओएस एक्स 10.5.x के लिए मौजूद हैं। :( –

उत्तर

13

मुझे एक ही समस्या थी और इसे हल करने का एक तरीका मिला।

मैंने थ्रेड नामों (1 धागा = 1 संदर्भ) के आधार पर विभिन्न संदर्भ बनाने के लिए एक तंत्र बनाया है।

NSManagedObjectModel *myNewObject = [myBackgroundContext objectWithID:[myObject objectID]]; 

आशा इस जवाब में मदद मिलेगी:

#include <pthread.h> 
... 

    mach_port_t threadID = pthread_mach_thread_np(pthread_self()); 
    NSString *threadName = [NSString stringWithFormat:@"%x", threadID]; 
    NSManagedObjectContext *context = [singleton.threadsContexts objectForKey:threadName]; 
    if (!context) { 
     NSLog(@"Creating managed context for thread named '%@'", threadName); 
     context = [[NSManagedObjectContext alloc] init]; 
     [context setPersistentStoreCoordinator:[singleton.managedObjectContext persistentStoreCoordinator]]; 

     //initialize dictionary in your singleton if it as not been yet 
     if(!singleton.threadsContexts) 
     { 
      singleton.threadsContexts = [NSMutableDictionary new]; 
     } 
     [singleton.threadsContexts setObject:context forKey:threadName]; 
    } 

    return result; 

और फिर, जब मैं एक पृष्ठभूमि थ्रेड में प्रबंधित वस्तु का एक पूर्ण संस्करण की आवश्यकता है, मैं इस सूत्र के लिए समर्पित वस्तु की एक प्रति प्राप्त।

+1

[[एनएसटीएचएड वर्तमान थ्रेड] नाम] आईओएस 7 पर मेरे लिए "" लौटाता है। [यह जवाब] (http://stackoverflow.com/a/15523049/1571490) ने मुझे एक सही स्ट्रिंग दिया। इसके अलावा, यह बेकार ढंग से काम करता है और ऐसा लगता है कि मेरे सभी कोर डेटा थ्रेडिंग मुद्दों को ठीक किया गया है। धन्यवाद! – fifarunnerr

+0

बहुत अच्छा काम करता है! मैंने इस क्रैश को नहीं देखा है क्योंकि मैं इस कोड का उपयोग कर रहा हूं! मुझे थ्रेड नाम प्राप्त करने के लिए फीफा की तकनीक का भी उपयोग करना पड़ा। एक और टिप, डॉन ' अपने सिंगलटन में एनएसएमयूटेबल डिक्शनरी को शुरू करना भूल गया ... मैं सर्कल में थोड़ा सा भाग गया जब तक मुझे एहसास हुआ कि :: डीयूएच :: – RyanG

+1

यह काफी पुराना उत्तर है और नई परियोजनाओं के लिए, मैं जादुई रिकॉर्ड का उपयोग कर रहा हूं जिसका निर्माण हुआ है बहु-थ्रेडिंग कोर डेटा के लिए समर्थन। दस्तावेज़ीकरण बहुत अच्छा नहीं है, लेकिन यह जानने के बाद कि यह इस lib का उपयोग कैसे करें, यह बहुत समय बचाता है। https://github.com/magicalpanda/MagicalRecord –

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