与Core Data中的原始数据分开保留脱机更改

时间:2016-05-16 11:58:33

标签: ios core-data offline-mode

我正在为我正在处理的应用添加“离线模式”功能。基本上,这个想法是用户应该能够对数据进行更改,例如,编辑项目的描述,而无需连接到互联网,并且更改应该在应用程序启动之间存在。

每次更改通常会在线工作时产生API请求,但在离线模式下情况会有所不同。

现在,这是通过将来自API的所有数据存储在充当缓存的Core Data数据库中来实现的。除普通属性外,用户可以编辑的实体具有以下内容:

  • locallyCreated - 对象是否已脱机创建
  • locallyDeleted - 对象已离线删除
  • locallyUpdated - 已更新

这样可以查找新的/删除/更新的对象,并在进行同步时发送相应的API请求。

这适用于创建和删除对象,但是,我发现这种方法的一个缺点是当从API检索新数据时,所有本地更改(即标记为本地更新的对象的属性)都将丢失,这意味着它们必须以某种方式单独存储。

解决此问题的最佳方法是什么?

1 个答案:

答案 0 :(得分:1)

由于您拥有locallyUpdated密钥,显而易见的答案是修改导入服务器更改的代码,以便它不会覆盖对标记为已更改的任何对象的更改。不管怎样,您需要避免覆盖这些更改,并且您已经记录了更改的对象,因此您已经拥有了基本解决方案的工具。

但是你很快就会遇到同步数据的复杂性。如果本地对象在一个键上有更改但是来自服务器的传入数据在另一个键上有更改,该怎么办?你不能仅仅通过知道本地副本以某种方式改变来解决这个问题。也许您决定服务器总是获胜,或者本地副本总是获胜。如果它们对您的应用程序有意义,那么这些很容易。如果您需要合并更改,那么您需要做一些工作。您不仅需要记录表示已进行更改的布尔值,还需记录已更改的键列表。这可能会变得复杂,但这是数据同步的本质。