gpt4 book ai didi

ios - iOS 7 上的 NS 合并冲突

转载 作者:技术小花猫 更新时间:2023-10-29 11:09:40 25 4
gpt4 key购买 nike

我已更新我的应用程序以支持 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com