代码之家  ›  专栏  ›  技术社区  ›  sanmai

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

  •  16
  • sanmai  · 技术社区  · 8 年前

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

    应用程序的持久容器。本实施 创建并返回一个容器,该容器已加载 应用于it。此属性是可选的,因为存在合法的

    用代码替换此实现以适当地处理错误。 fatalError()

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

    • 父目录不存在、无法创建或不允许写入。
    • 无法将存储迁移到当前模型版本。

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

    我到处找,但找不到任何例子。

    1 回复  |  直到 8 年前
        1
  •  11
  •   Tom Harrington    8 年前

    fatalError 是唯一对该错误有意义的“处理”,尽管您可能希望显示一个警报,告诉用户首先发生了什么。如果你需要你的持久存储,但你无法加载它,你就有点完蛋了。

    其中一些错误应该在开发过程中出现。比如商店迁移或数据保护问题——你需要对此进行测试,如有必要,在发布前修复应用程序。对于这种情况, 法塔莱罗 实际上是有道理的,因为只有你才会经历它。

    在这些列出的例子中,唯一一个可能意外出现的、难以测试的例子是设备空间不足。你 检查可用空间并提醒用户。但你仍然没有任何方法从错误中恢复,除非你的应用程序占用了大量空间,你可以清除掉。如果发生这种情况,iOS将已经警告他们空间不足,因此没有必要自己动手。

    如果你没有很多数据可以清除, 法塔莱罗