2017-08-17 148 views
4

我的AppDelegate带着以下所有熟悉的核心数据模板:如何处理NSPersistentContainer.loadPersistentStores中的错误?

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,如果数据存储被损坏因任何原因,用户将不得不重新安装应用程序不知道这一点。在这种情况下,用户也可以删除并忘记我的应用。

现在,人们应该怎么处理这样的错误呢?即使我编写错误处理代码,如果这些错误几乎从不发生,我该如何测试才能正常工作?

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

+0

我认为你应该为它创建一个提醒消息,就是这样。 – Mannopson

回答

2

在大多数情况下,fatalError是唯一对此错误有意义的“处理”,尽管您可能想要显示告警,告诉用户发生了什么事情。如果你需要持久存储,但你无法加载它,那么你有点儿搞砸了。

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

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

如果您没有很多数据可以清除,fatalError在这里仍然有用。

+0

设备空间不足时出现问题。我应该继续为这种情况使用'fatalError'? – Mannopson

+1

也许吧。与任何错误处理情况一样,您需要回答这个问题,您的应用程序可能会做什么来恢复?如果设备已满,您的应用有什么用处?如果是这样,请尝试做到这一点。如果没有,那么没有其他的方式来回应。 –

+0

感谢您的评论!所以我还没有任何恢复选择。这个错误只会引发第一次对吗? (当第一次启动应用程序时)。如果我可以检查'persistentContainer'的状态会更好。如果成功创建,用户必须能够将数据添加到'persistentStore'。可以检查这个状态吗?再次感谢 – Mannopson