NSManagedObjectContext保存的可能原因的确切列表可能会失败

时间:2016-05-20 07:02:43

标签: ios swift core-data

TL; DR版:是否有-[NSManagedObjectContext save:]可能失败的可能原因的明确清单?我正在查看CoreDataErrors.h,但不清楚哪个键与NSDetailedErrorsKey有关。

背景:我正在维护一个使用Swift和Objective-C组合编写的送货应用程序。它使用JSQCoreDataKit。其他人最初编写了代码。

我们遇到了无法重现的生产崩溃。我们可以从堆栈跟踪中看出,在NSManagedObjectContext保存失败后,EXC_BAD_ACCESS尝试将NSError记录到控制台时,它在错误处理程序中崩溃。保存失败在子上下文中,我们知道当时正在修改的模型类。

因此我们可以告诉保存失败,但我们没有关于保存失败原因的详细信息。

我们希望从保存失败的原因向后工作,希望为崩溃制作复制品,以便测试任何可能的修复。

崩溃实际上是保存失败的副作用。因此,虽然我们想要修复崩溃,但我们还需要找出保存失败的原因。

对于95%的用户,保存没有问题。

该模型有一些非可选字段,数据来自从服务器响应中解析的JSON。在这个阶段,我们没有理由怀疑服务器正在向我们发送不良数据。

是否有人知道我们可以解决的保存失败的可能原因的最终列表,从而消除了选项?

到目前为止,我已经意识到了:

  • 验证失败,例如缺少必需值,或模型中指定的最大/最小值之外的值。
  • 可能的保存冲突(请参阅NSPersistentStoreSaveConflictsErrorKey)。但是,当从子环境保存到父环境时,是否可以使用此功能并不清楚。

1 个答案:

答案 0 :(得分:1)

永远不会成为失败-save:且没有错误。每当我看到这种情况,我的代码就会出错。

您是否可以通过显示错误位置周围的代码来更新问题?

保存的可能失败是:

  • 合并失败(最常见)
  • 验证失败(不太常见)
  • NSPersistentStore
  • 中未定义任何商店
  • nil NSManagedObjectContext(这将介绍您描述的案例)

除了最后一个之外的所有这些都会产生一个要询问的错误对象。