【问题标题】:iOS7 NSMergeConflict on Single Thread Save单线程安全上的 iOS7 NS 合并冲突
【发布时间】:2013-11-09 07:53:16
【问题描述】:

在对两行重新排序后,在单线程应用程序上保存简单数据时遇到问题。

我已设法简化编码以重现该错误,并希望其他人尝试此方法后提出第二意见。

这是一个健全性检查,因为我怀疑 iOS 7 引入的核心数据问题,因为这在 iOS 6 中运行良好。

首先,启动一个新的核心数据项目并创建这个模型......

属性“当前”是一个可选的布尔值。一对多关系是有序关系,创建一个NSOrderedDataset。

现在向应用程序添加几个按钮;第一个创建数据(一个项目和两个关联的“图纸”),第二个交换两个图纸,然后在第一个图纸中设置一个属性。

这是代码...

-(IBAction)onTestButton:(id)sender
{
    id delegate = [[UIApplication sharedApplication]delegate];
    NSManagedObjectContext *managedObjectContext = [delegate managedObjectContext];

    self.project = [NSEntityDescription insertNewObjectForEntityForName:@"Project" inManagedObjectContext:managedObjectContext];
    Drawing *drawing1 = [NSEntityDescription insertNewObjectForEntityForName:@"Drawing" inManagedObjectContext:managedObjectContext];
    Drawing *drawing2 = [NSEntityDescription insertNewObjectForEntityForName:@"Drawing" inManagedObjectContext:managedObjectContext];

    NSMutableOrderedSet* tempSet = [NSMutableOrderedSet orderedSetWithOrderedSet:self.project.drawings];
    [tempSet addObject:drawing1];
    [tempSet addObject:drawing2];
    self.project.drawings = tempSet;

    [self save];
}

-(IBAction)onTestButton2:(id)sender
{
    NSMutableOrderedSet *exchange = [self.project mutableOrderedSetValueForKey:@"drawings"];
    [exchange exchangeObjectAtIndex:0 withObjectAtIndex:1];
    self.project.drawings = exchange;

    [self save];

    Drawing *drawing = [self.project.drawings objectAtIndex:0];

    BOOL current = [drawing.current boolValue];
    drawing.current = [NSNumber numberWithBool:!current];

    [self save];
}

-(void)save
{
    id delegate = [[UIApplication sharedApplication]delegate];
    NSManagedObjectContext *managedObjectContext = [delegate managedObjectContext];
    NSError *error = nil;

    if( ![managedObjectContext save:&error] )
    {
        NSLog(@"%@ Save: Unresolved Error on Save %@", error, [error userInfo] );
        abort();
    }
}

现在,按第一个测试按钮进行测试。这将设置数据。

然后按第二个测试按钮....一切OK!!!

现在按下第二个测试按钮再次和 BANG。你应该得到一个类似这样的 NSMergeConflict 错误......

保存:保存时未解决的错误 { 冲突列表 = ( “NSManagedObject (0x8bedfa0) 的 NSMergeConflict (0x8a7d0b0) 与 objectID '0x8bd9340 ' 和 oldVersion = 1 和 newVersion = 2 和旧对象快照 = {\n
当前 = \"\";\n 项目 = \"0x8bc3f50 \";\n} 和新的缓存行 = {\n 当前 = \"\";\n 项目 = \"0x8aa88c0 \";\n}" );

我从错误中注意到我的项目对象已更改。然而,这是一个使用主应用上下文的单线程应用。

我在这方面花了太长时间,希望其他人能就问题所在发表评论。这是一个核心数据错误,还是我是一个正确的“傻瓜”?

非常感谢

/菲托

【问题讨论】:

  • onTestButton2 中的哪个save 调用会导致错误?
  • 第二个。总是在保存“交换”后尝试更改数据
  • 我可以重现这个,但我真的不知道是 wtf 造成的。
  • 谢谢。至少我知道我不是完全愚蠢的。我想知道这是否是核心数据问题。

标签: ios iphone ipad core-data ios7


【解决方案1】:

我遇到了类似的问题,在这里找到了解决方法:

http://prod.lists.apple.com/archives/cocoa-dev/2013/Oct/msg00657.html

简而言之 - 将此添加到您的 MOC 设置中:

  [_managedObjectContext setMergePolicy:[[NSMergePolicy alloc] initWithMergeType:NSMergeByPropertyObjectTrumpMergePolicyType]];

这在使用 NSSQLStoreType 时也会影响 OS X 10.9 Mavericks。我无法使用 NSXMLStoreType 重复合并错误。

对于 Swift 2.x

managedObjectContext.mergePolicy = NSMergePolicy(mergeType: .MergeByPropertyObjectTrumpMergePolicyType)

【讨论】:

  • 谢谢,可以解决。呸!不知道为什么会这样。只能假设核心数据在幕后进行“隐形”翻筋斗。
  • 不太明白为什么,但这似乎解决了我的 AFIncrementalStore 崩溃问题。太感谢了!调试了好几天了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-10-18
  • 2016-12-09
  • 2018-03-03
  • 1970-01-01
相关资源
最近更新 更多