小编典典

如何将 iPhone Core Data 与 Web 服务器同步,然后推送到其他设备?

all

我一直在研究一种在多个设备(例如 iPad 或 Mac)之间同步存储在 iPhone 应用程序中的核心数据的方法。iOS 上与 Core Data
一起使用的同步框架并不多(如果有的话)。但是,我一直在思考以下概念:

  1. 对本地核心数据存储进行更改,并保存更改。(a) 如果设备在线,它会尝试将变更集发送到服务器,包括发送变更集的设备的设备 ID。(b) 如果变更集没有到达服务器,或者设备不在线,应用程序会将变更集添加到队列中,以便在它上线时发送。
  2. 位于云中的服务器将其接收到的特定更改集与其主数据库合并。
  3. 在云服务器上合并更改集(或更改集队列)后,服务器使用某种轮询系统将所有这些更改集推送到向服务器注册的其他设备。(我想使用 Apple 的 Push 服务,但显然根据评论这不是一个可行的系统。)

我需要考虑什么花哨的事情吗?我看过 REST
框架,例如ObjectiveResourceCore
Resource
RestfulCoreData。当然,这些都与
Ruby on Rails 一起工作,我不依赖于它,但它是一个开始的地方。我对解决方案的主要要求是:

  1. 任何更改都应该在后台发送而不暂停主线程。
  2. 它应该使用尽可能少的带宽。

我考虑了一些挑战:

  1. 确保将不同设备上不同数据存储的对象 ID 附加到服务器上。也就是说,我将有一个对象 ID 和设备 ID 表,它们通过对存储在数据库中的对象的引用来绑定。我会有一条记录(DatabaseId[对这个表唯一],ObjectId[对整个数据库中的项目唯一],Datafield1,Datafield2),ObjectId字段会引用另一个表,AllObjects:(ObjectId,DeviceId,DeviceObjectId)。然后,当设备推送一个变更集时,它会从本地数据存储中的核心数据对象传递设备 ID 和 objectId。然后我的云服务器会检查 AllObjects 表中的 objectId 和 device Id,并在初始表中找到要更改的记录。
  2. 所有更改都应加盖时间戳,以便可以合并它们。
  3. 设备将不得不轮询服务器,而不会消耗太多电池。
  4. 如果/当从服务器接收到更改时,本地设备还需要更新内存中保存的任何内容。

还有什么我在这里想念的吗?我应该看什么样的框架才能使这成为可能?


阅读 82

收藏
2022-04-21

共1个答案

小编典典

我建议仔细阅读并实施 Dan Grover 在 iPhone 2009
大会上讨论的同步策略,此处提供
pdf 文档。

这是一个可行的解决方案,实现起来并不难(Dan 在其几个应用程序中实现了这一点),与 Chris 描述的解决方案重叠。有关同步的深入理论讨论,请参阅
Russ Cox (MIT) 和 William Josephson (Princeton) 的论文:

与向量时间对的文件同步

这同样适用于核心数据,但有一些明显的修改。这提供了一个整体上更加健壮和可靠的同步策略,但需要更多的努力才能正确实施。

编辑:

Grover 的 pdf 文件似乎不再可用(断开的链接,2015 年 3 月)。更新:该链接可通过此处的 Way Back Machine
获得

由 Marcus Zarra 开发的名为ZSync的 Objective-C
框架已被弃用,因为 iCloud 似乎最终支持正确的核心数据同步。

2022-04-21