核心数据 MOC 保存暂停执行并且无法保存(无错误或崩溃)

Posted

技术标签:

【中文标题】核心数据 MOC 保存暂停执行并且无法保存(无错误或崩溃)【英文标题】:core data MOC save pauses execution and fails to save (w/o error or crash) 【发布时间】:2014-04-08 21:03:47 【问题描述】:

我最近实现了核心数据并发和线程限制。我正在消除皱纹。

我有一个主 MOC 和一个私有 MOC,每个 MOC 都以非分层方式链接到 PSC。每次保存时它们都会合并。

我遇到了 MOC 保存失败的问题。应用程序没有崩溃,但对象没有保存并且执行暂停(但可以恢复),并在问题导航器中显示以下内容:

如您所见,这是在私有 MOC 队列中执行的,这是正确的,因为这是执行暂停的行:

如您所见,我在私有 MOC 队列中将保存消息发送到私有 MOC。

关于如何解决此问题的任何想法?因为我没有收到错误消息,所以我真的不知道从哪里开始。谢谢!

更新

我按照 Marcus 的指示替换了我的保存/错误代码。现在是这样的:

[[self privateManagedObjectContext] performBlockAndWait:^
    NSError *error = nil;
    if (![[self privateManagedObjectContext] save:&error]) 
        NSLog(@"ERROR SAVING MOC IN syncParseObjectLocally: %@\n%@", [error localizedDescription], [error userInfo]);
    
    NSLog(@"%@", error);
    NSLog(@"%@\n%@", [error localizedDescription], [error userInfo]);
];

在日志中,这会产生所有null

我没有使用 iCloud。

当我关闭 all-(objective-c-)exceptions 断点时,执行会无缝继续(所以我可能可以忽略这个问题,但更重要的是,我需要解决这个可能相关的问题:core data changes don't merge)

当我在断点触发时手动输入'po error'时,日志显示:

(lldb) po error
 nil

【问题讨论】:

【参考方案1】:

您可能遇到了内部异常之一。每当存在潜在的合并冲突时,Core Data 将在内部抛出异常。它可能会解决合并(这就是您所看到的),但它仍然会抛出。

要对此进行测试,请将断点更改为仅在 Objective-C 异常而不是 C++ 异常上中断。如果您不再看到中断,那么这就是您所看到的。

另外,归档一个雷达;这个例外很烦人,如果我们有足够的票数来查看它,我会很高兴的。

更新

有控制台输出吗?

error 变量中有值吗?

我知道您说您没有收到错误消息,但我想验证 error 变量是 nil 与没有有效负载。您可以在该断点处执行po error 吗?

另外,我会尝试将该行代码更改为:

[[self privateManagedObjectContext] performBlockAndWait:^
  NSError *error = nil;
  if (![[self privateManagedObjectContext] save:&error]) 
    NSLog(@"ERROR SAVING MOC IN syncParseObjectLocally: %@\n%@", [error localizedDescription], [error userInfo]);
  
];

只是为了测试队列真的属于 this NSManagedObjectContext

更新

你在使用 iCloud 吗?

如果关闭断点,应用程序是否可以正常运行?

当我提到po error 时,我的意思是在断点被击中时执行它并手动输入它。

我相信拨打-performBlockAndWait: 也没有任何效果。

我想知道您是否在 Core Data 中发现了另一个新的内部异常,我希望我们能够隔离导致它触发的原因。

【讨论】:

Apple 的内部异常让我在调试时发疯。 Grrrr。 谢谢。实际上,我唯一的通用断点已经是“所有 Objective-C 异常”(由于 AVPlayer 的奇怪断点,我将其设置为这种方式)。那我该怎么办? 查看问题更新。看起来还没有运气,但我感谢您的关注。 马库斯,我已经回复了所有这些。但更重要的是,我意识到我的 MOC 没有正确合并,我认为弄清楚为什么会发生这种情况是更合乎逻辑的第一步,并且可能会消除这个问题。我提出这个问题的新问题是***.com/questions/22994183/…。再次感谢

以上是关于核心数据 MOC 保存暂停执行并且无法保存(无错误或崩溃)的主要内容,如果未能解决你的问题,请参考以下文章

由于验证规则上下文导致的 iOS 核心数据保存 MOC 问题

无法保存文档“xyz”。发生多个验证错误

核心数据错误 133020:在保存中合并问题:

CoreData 在后台 MOC 的保存操作期间无法完成故障

核心数据与用于核心数据的单个 MOC 和主线程合并冲突

无法识别的选择器 - 保存到核心数据