我的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,如果数据存储因任何原因而被破坏,用户将不得不重新安装应用程序不知道这一点。在这种情况下,用户也可以删除并忘记我的应用程序。
现在,人们应该如何处理此类错误和其他错误?即使我编写了错误处理代码,如果这些错误几乎不会发生,我该如何测试呢?
我看了一遍,但找不到任何例子。
答案 0 :(得分:7)
在大多数情况下,fatalError
是唯一的"处理"这对于此错误有意义,但您可能希望显示一条警告,告诉用户首先发生了什么。如果您需要持久存储,但无法加载它,那么您就会被搞砸了。
其中一些错误是开发过程中应该出现的问题。与商店迁移或数据保护问题一样 - 您需要对其进行测试,并在必要时在发布前修复应用。对于这样的情况,fatalError
实际上是有意义的,因为只有你会经历它。
在那些列出的例子中,唯一可能意外出现的可能难以测试的是设备空间不足。您可以检查可用空间并提醒用户。但是除非你的应用程序使用了大量可以清除的空间,否则你仍然无法从错误中恢复。如果发生这种情况,iOS会警告他们他们的空间不足,所以自己动手并不是必需的。
如果您没有大量数据可以清除,fatalError
仍然有用。