将离线更改与核心数据中的原始数据分开保存

Persist offline changes separately from original data in Core Data

我正在为我目前正在开发的应用程序添加 "offline mode" 功能。基本上这个想法是用户应该能够对数据进行更改,例如,编辑项目的描述,而无需连接到互联网,并且更改应该在应用程序启动之间保留。

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

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

这使得查找 new/deleted/updated 对象并在同步时发送相应的 API 请求成为可能。

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

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

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

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