2013-10-04 11 views
8

पर मैं आईओएस 7 समर्थन करने के लिए मेरे एप्लिकेशन को अद्यतन किया है और इस समस्या का सामना करना पड़ गया है कि में स्क्रीन से एक पर मेरी [context save]; मैं निम्नलिखित त्रुटि मिलती है:NSMergeConflict iOS7

NSCocoaErrorDomain Code=133020 "The operation couldn’t be completed. (Cocoa error 133020.)" UserInfo=0x1115a6d0 {conflictList=(
"NSMergeConflict (0x1115a670) for NSManagedObject (0xf25c850) with objectID '0xf25c070 <x-coredata://76AF57C8-F7FF-4880-B06B-63F8B780C96D/Screen/p7>' with oldVersion = 5 and newVersion = 6 
and old object snapshot = {\n index = 3;\n message = \"<null>\";\n status = 0;\n} and new cached row = {\n index = 3;\n message = \"<null>\";\n status = 0;\n}" 

iOS6 पर इस समस्या नहीं होती है ।

अद्यतन: कोड के लिए managedObjectContext

-(NSManagedObjectContext *)managedObjectContextForCurrentThread{ 
if ([NSThread isMainThread]) 
{ 
    NSManagedObjectContext *parentContext = self.mainManagedObjectContext.parentContext; 
    [parentContext performBlockAndWait:^{ 
     NSMergePolicy *mergePolicy = [[NSMergePolicy alloc] initWithMergeType:NSMergeByPropertyObjectTrumpMergePolicyType]; 
     [[self mainManagedObjectContext] setMergePolicy:mergePolicy]; 
    }]; 
    return self.mainManagedObjectContext; 
} 
else 
{ 
    NSMutableDictionary *threadDict = [[NSThread currentThread] threadDictionary]; 
    NSManagedObjectContext *threadContext = [threadDict objectForKey:kCGMManagedObjectContextKey]; 
    if (threadContext == nil) 
    { 
     threadContext = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSPrivateQueueConcurrencyType]; 
     NSManagedObjectContext *parentContext = self.mainManagedObjectContext.parentContext; 
     [parentContext performBlockAndWait:^{ 
      NSMergePolicy *mergePolicy = [[NSMergePolicy alloc] initWithMergeType:NSMergeByPropertyObjectTrumpMergePolicyType]; 
      [parentContext setMergePolicy:mergePolicy]; 
     }]; 
     [threadContext setParentContext:self.mainManagedObjectContext]; 
     [threadDict setObject:threadContext forKey:kCGMManagedObjectContextKey]; 
    } 
    return threadContext; 
} 

}

+0

ठीक उसी समस्या का सामना कर रहा हूं, जिस समाधान पर आप आए थे? मुझे समझ में नहीं आ रहा है कि यद्यपि यह समस्या क्यों है, आईओएस 6 शिकायत नहीं करता है। मेरे मामले में मुझे कोई कारण नहीं दिख रहा है कि ऐसा क्यों होना चाहिए क्योंकि प्रबंधित किए गए प्रबंधित ऑब्जेक्ट मैं एक ही प्रबंधित प्रबंधित ऑब्जेक्ट कॉन्टेक्स्ट से हूं जो मैं सहेज रहा हूं, यह त्रुटियों को मर्ज करने के बारे में शिकायत क्यों करनी चाहिए? –

उत्तर

15

सेब के दस्तावेज़

NSManagedObjectMergeError = 133020

इस त्रुटि कोड को निरूपित करने के लिए कि किसी मर्ज नीति विफल रही है कोर डेटा के अनुसार विलय को पूरा करने में असमर्थ है।

क्या आपके कोड में कोई मर्ज पॉलिसी है? कृपया NSMergeByPropertyObjectTrumpMergePolicy आज़माएं।

[self.context setMergePolicy:NSMergeByPropertyObjectTrumpMergePolicy]; 
16

मैंने बस उसी दिन त्रुटि को डीबग करने में बिताया। आपके ऐप और खान के बीच का अंतर यह है कि मेरा मुख्य स्रोत केवल मुख्य थ्रेड से कोर डेटा तक पहुंचता है, इसलिए मर्ज त्रुटि और भी परेशान थी।

हमारे मामले में मैंने इसे इस तथ्य से संकुचित कर दिया कि हमारे पास एक unidirectional संबंध था - ए में कई बीएस (एनएसएससेट के रूप में मॉडलिंग) हैं, लेकिन बी को इसकी ए नहीं पता है। हमारे पास एक तरीका था जो ए को संशोधित करता था और एक बी, और जब हम उन परिवर्तनों को सहेजने के लिए गए थे तो विलय त्रुटि उत्पन्न होगी। यह कोड आईओएस 5 & 6 दोनों पर लंबे समय तक ठीक काम करता था, और केवल आईओएस 7 पर विफल होना शुरू हुआ।

यह सच है कि विलय नीति जोड़ना त्रुटि को दूर कर देगा, लेकिन यह अन्य त्रुटियों को भी मुखौटा कर सकता है। हमारे मामले में हम असंगत डीबी होने के जोखिम से उन त्रुटियों को देखना चाहते हैं।

बिडरेक्शनल से संबंध बदलने से त्रुटि दूर हो गई। हमारे ऐप के लिए बैक लिंक जरूरी नहीं हैं, लेकिन वे या तो चोट नहीं पहुंचा रहे हैं। (और खुशी से, इस रिश्ते को बदलने के लिए सही ढंग से एक हल्के प्रवास के रूप में संचालित किया गया - कोर डेटा स्वचालित रूप से हमारे लिए उन वापस लिंक में भर दिया।)

+0

मेरे पास एक ही समस्या है और इससे मुझे हल करने में मदद मिली! NSMergeConflict बहुत स्पष्ट नहीं था:/ – davbryn

+0

कोर डेटा संपादक में 'व्यस्त' फ़ील्ड सेट करना भी याद रखें। हमारे पास ऐप में द्विपक्षीय रिश्तों थे लेकिन देव ठीक से उलटा सेटअप भूल गया और इससे इस छद्म संघर्ष का कारण बन गया। –

0

मैं इसी तरह की त्रुटि मिली, और मेरे मामले में, ताला लगा NSPersistentStoreCoordinator काम किया।

[context.persistentStoreCoordinator lock]; 
[context performBlockAndWait:^{ 
    // do something 
}]; 
[context.persistentStoreCoordinator unlock] 

मुझे नहीं पता कि यह क्यों काम करता है, लेकिन मुझे NSManagedObjectContext की बग पर संदेह है। मुझे आशा है कि इससे मदद मिलेगी।

0

मुझे पूर्ण भंडारण के साथ परीक्षण करते समय यह मिला। तो ऐसा लगता है कि किसी भी तरह की विफलता में विफलता (मेरे मामले में, भंडारण भरा हुआ है और लगातार स्टोर अपडेट नहीं किया जा सकता है) यह उत्पन्न करेगा।

5

ऐप्पल वॉचकिट एक्सटेंशन के साथ एक्सकोड 6.3.2 का उपयोग करना और मुझे कई अपडेट करने और सहेजने का प्रयास करते समय यह वही त्रुटि मिली। setMergePolicy समस्या हल हो और यहां तेज कोड हैं:

context.mergePolicy = NSMergeByPropertyObjectTrumpMergePolicy 

context.save आदेश से पहले ऊपर लाइन डालने के लिए सुनिश्चित करें।

+0

स्विफ्ट का उपयोग करके, यह अनिवार्य रूप से एक ही समस्या को हल करने में सही काम करता था। धन्यवाद! – Pierce

+0

मेरे पास ** कभी ** इस पर नहीं आया होगा! यह भी जानना नहीं चाहते कि इस सिंगल लाइन को पढ़ने और समस्या निवारण के कितने घंटे ने मुझे बचाया है। –

1

मैं NSMergeConflict पहले जो कुछ भी कर रहा था उसे समझने के बिना विलय नीति सेट करके संभावित समस्या को मास्क नहीं करना चाहता था।

मेरी स्थिति में मैंने अपने कोड में पहले NSBatchDeleteRequest किया था। NSBatchDeleteRequest सीधे स्टोर समन्वयक पर किया जाता है, इसलिए ManagedObjectContext हटाए जाने वाले सामानों से अनजान था और अभी भी हटाए गए ऑब्जेक्ट्स के संदर्भ थे। जब मैंने बाद में इन वस्तुओं में से एक का संदर्भ दिया और संदर्भ को सहेजने की कोशिश की, तो NSMergeConflict फेंक दिया गया।

हटाए जाने के बाद मेरे moc पर reset() पर कॉल करना समस्या को हल करने के बाद।

let fetchRequest = NSFetchRequest<NSFetchRequestResult>(entityName: "Tasks") 
let batchDeleteRequest = NSBatchDeleteRequest(fetchRequest: fetchRequest) 
try managedContext.execute(batchDeleteRequest) 
managedContext.reset() 
संबंधित मुद्दे