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

时间:2017-08-17 02:20:01

标签: ios swift core-data

我的AppDelegate带有以下所有熟悉的核心数据模板:

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
}()

它还有以下评论:

  

应用程序的持久容器。这个实现   创建并返回一个容器,为它加载了商店   申请。此属性是可选的,因为它是合法的   错误条件可能导致存储的创建失败。

     

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

     

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

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

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

是的,在这个地方调用它退出是一个坏主意,不仅在生产应用程序中不允许它,而且因为as I read elsewhere,如果数据存储因任何原因而被破坏,用户将不得不重新安装应用程序不知道这一点。在这种情况下,用户也可以删除并忘记我的应用程序。

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

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

1 个答案:

答案 0 :(得分:7)

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

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

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

如果您没有大量数据可以清除,fatalError仍然有用。