我已更新我的应用程序以支持 iOS 7,但在我的 [context save];
中的其中一个屏幕上遇到了以下错误:
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;
}
最佳答案
我刚刚花了两天时间调试完全相同的错误。你的应用和我的不同,我的应用只从主线程访问核心数据,所以合并错误更加令人费解。
在我们的例子中,我将它缩小到我们有一个单向关系这一事实——A 有很多 B(建模为 NSSet),但 B 不知道它的 A。我们有一个方法修改了 A 和a B,当我们去保存这些更改时会导致合并错误。这段代码在 iOS 5 和 6 上运行了很长时间,但在 iOS 7 上才开始失败。
添加合并策略确实会使错误消失,但它也可能掩盖其他错误。在我们的例子中,我们宁愿看到这些错误,也不愿冒数据库不一致的风险。
将关系更改为双向使错误消失。反向链接对于我们的应用程序来说不是必需的,但它们也没有坏处。 (令人高兴的是,更改这种关系作为轻量级迁移得到了正确处理 - 核心数据自动为我们填充了这些反向链接。)
关于ios - iOS 7 上的 NS 合并冲突,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19178972/