ios - 如何创建 CoreData 状态的快照?

标签 ios swift core-data

背景故事

我正在开发一个大型 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/

相关文章:

IOS:注销使用 CoreText 注册的字体

ios - 快速从数组中获取值?

iOS 9.2 UIDatePicker 角和边框不工作

ios - 如何替换 NSMutableAttributedString 中的字符串?

ios - 为什么 NSManagedObject 子类不能使用 class_copyMethodList 找到动态生成的方法?

ios - 多个UIManagedDocument用于读写

ios - NS谓词字符串

ios - 从 NSArray 中删除重复的键值

swift - 在不干扰启动画面的情况下添加导航 Controller 的正确方法是什么

ios - 将图像保存到模拟器中的照片应用程序 - 在 iOS 13 中生成屏幕截图