ios - iOS 7 上的 NS 合并冲突

标签 ios objective-c core-data merge

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

相关文章:

iphone - 扩展教程 Material 时 entityForName 和 ManagedObjectContext 的问题

ios - NSSet 中的第一个实体具有较短的 ID,并且不保留值更改

ios - 如何在 Xcode 中将商品添加到 Outlet Collection

ios - iOS 上的低延迟音频输出问题(又名如何击败 AUAudioUnit SampleRate、MaximumFramesToRender 和 ioBufferDuration 提交)

ios - 在后台获取中加载 UIWebView

ios - 类型 'UnsafeMutableRawPointer' 的值没有下标 Swift 5

iphone - 如何将数据插入 iPhone 中的 SQLite 数据库

iOS 7 模态视图使按钮变灰(禁用)

ios - 尝试播放录制的文件时文件路径不正确

ios - 为什么我不能将 UICollectionViewFlowLayout 中的 referenceSizeForFooterInSection 与 EstimateItemSize 一起使用?