如何处理NSPersistentContainer.loadPersistentStores中的错误?

san*_*mai 9 core-data ios swift

我的AppDelegate附带了以下所有熟悉的Core Data模板:

lazy var persistentContainer: NSPersistentContainer = {
    let container = NSPersistentContainer(name: "newsapp")
    container.loadPersistentStores(completionHandler: { (storeDescription, error) in
        if let error = error as NSError? {
            fatalError("Unresolved error \(error), \(error.userInfo)")
        }
    })
    return container
}()
Run Code Online (Sandbox Code Playgroud)

它还有以下评论:

应用程序的持久容器.此实现创建并返回一个容器,已将应用程序的存储加载到该容器.此属性是可选的,因为存在可能导致存储创建失败的合法错误条件.

用代码替换此实现以适当地处理错误. fatalError()导致应用程序生成崩溃日志并终止.您不应在运输应用程序中使用此功能,尽管它在开发期间可能很有用.

此处出现错误的典型原因包括:

  • 父目录不存在,无法创建或不允许写入.
  • 由于设备被锁定时的权限或数据保护,持久性存储无法访问.
  • 设备空间不足.
  • 商店无法迁移到当前的模型版本.

检查错误消息以确定实际问题是什么.

确实,在这个地方调用它是一个坏主意不仅在生产应用程序中不允许它,而且因为,正如我在其他地方读到的那样,如果数据存储因任何原因而被破坏,用户将不得不重新安装应用程序而不知道关于那个.在这种情况下,用户也可以删除并忘记我的应用程序.

现在,人们应该如何处理此类错误和其他错误?即使我编写了错误处理代码,如果这些错误几乎不会发生,我该如何测试呢?

我看了一遍,但找不到任何例子.

Tom*_*ton 8

在大多数情况下,这fatalError是唯一对此错误有意义的"处理",尽管您可能希望显示一个警告,告诉用户首先发生了什么.如果你需要你的持久存储,但你无法加载它,你就有点搞砸了.

其中一些错误是开发过程中应该出现的问题.与商店迁移或数据保护问题一样 - 您需要对其进行测试,并在必要时在发布前修复应用.对于这样的情况,fatalError实际上是有道理的,因为只有你会经历它.

在那些列出的示例中,唯一可能出乎意料地出现的可能难以测试的是设备空间不足.您可以检查可用空间并提醒用户.但是你仍然无法从错误中恢复,除非你的应用程序使用了大量可以清除的空间.如果发生这种情况,iOS就会警告他们他们的空间不足,所以不必自己动手.

如果你没有很多数据可以清除,那么fatalError这里仍然有意义.