背景故事
我正在开发一个大型 iOS 应用程序。此应用程序在特定假设下运行。其中最主要的是应用程序应该使用内部存储脱机工作,内部存储是服务器上保存的数据的最后同步状态的快照。我决定使用 CoreData 来处理这个存储。每次启动应用程序时,我都会检查 WiFi 连接是否已启用,然后尝试将存储与服务器同步。由于数据大小,同步可能需要大约 3 分钟。
同步过程由几个阶段组成,在每个阶段我:
- 从服务器获取一些数据 (XML)
- 反序列化
- 将其保存在核心数据中
问题
同步过程可能因多种原因而中断(互联网连接、服务器停机、用户离开应用程序等)。这可能会导致数据不同步。
让我们假设同步过程有 5 个阶段,它在第三个阶段后中断。它导致 3/5 的数据在内部存储中更新,其余数据不同步。我不允许这样做,因为数据彼此紧密相连(业务逻辑)。
目标
我不知道是否可行,但我正在考虑实现一种解决方案。在同步过程开始时,我想创建 Core Date 当前状态的快照(某种副本),并在同步过程中对其进行处理。当同步过程成功完成时,此快照可能会覆盖当前的 CoreData 状态。当同步中断时,可以简单地中止快照。我的内部存储将受到保护。
问题
- 如何创建 CoreData 快照?
- 如何使用 CoreData 快照?
- 如何用快照覆盖 CoreDate 状态?
感谢任何帮助的建议。如果可能的话,代码示例将不胜感激。
编辑 1
数据量太大,无法用多个 CoreData 上下文处理。在同步期间,我多次保存当前上下文以清理内存。如果我不这样做,应用程序将因内存错误而崩溃。
我认为它应该通过多个 NSPersistentStoreCoordinator
来解决,例如使用这个方法:link .不幸的是,我不知道如何实现它。
最佳答案
你应该完全按照你说的去做。只需使用“加载”、“同步”和“保存”方法创建类(我们称之为 SyncBuffer)。
“加载”方法应该从 CoreData 中读取所有实体并将其存储在类变量中。 “同步”方法应该使用类变量进行所有同步。 最后,“save”方法应该将类变量中的所有值保存到 CoreData - 在这里您甚至可以从 CoreData 中删除所有数据并从 SyncBuffer 中保存全新的值。
关于ios - 如何创建 CoreData 状态的快照?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54042520/