我一直在研究一种在多个设备(例如 iPad 或 Mac)之间同步存储在 iPhone 应用程序中的核心数据的方法。iOS 上与 Core Data 一起使用的同步框架并不多(如果有的话)。但是,我一直在思考以下概念:
- 对本地核心数据存储进行更改,并保存更改。(a) 如果设备在线,它会尝试将变更集发送到服务器,包括发送变更集的设备的设备 ID。(b) 如果变更集没有到达服务器,或者设备不在线,应用程序会将变更集添加到队列中,以便在它上线时发送。
- 位于云中的服务器将其接收到的特定更改集与其主数据库合并。
- 在云服务器上合并更改集(或更改集队列)后,服务器使用某种轮询系统将所有这些更改集推送到向服务器注册的其他设备。(我想使用 Apple 的 Push 服务,但显然根据评论这不是一个可行的系统。)
我需要考虑什么花哨的事情吗?我看过 REST 框架,例如ObjectiveResource、Core Resource和RestfulCoreData。当然,这些都与 Ruby on Rails 一起工作,我不依赖于它,但它是一个开始的地方。我对解决方案的主要要求是:
- 任何更改都应该在后台发送而不暂停主线程。
- 它应该使用尽可能少的带宽。
我考虑了一些挑战:
- 确保将不同设备上不同数据存储的对象 ID 附加到服务器上。也就是说,我将有一个对象 ID 和设备 ID 表,它们通过对存储在数据库中的对象的引用来绑定。我会有一条记录(DatabaseId[对这个表唯一],ObjectId[对整个数据库中的项目唯一],Datafield1,Datafield2),ObjectId字段会引用另一个表,AllObjects:(ObjectId,DeviceId,DeviceObjectId)。然后,当设备推送一个变更集时,它将从本地数据存储中的核心数据对象传递设备 Id 和 objectId。然后我的云服务器会检查 AllObjects 表中的 objectId 和 device Id,并在初始表中找到要更改的记录。
- 所有更改都应加盖时间戳,以便可以合并它们。
- 设备将不得不轮询服务器,而不会消耗太多电池。
- 如果/当从服务器接收到更改时,本地设备还需要更新内存中保存的任何内容。
还有什么我在这里想念的吗?我应该看什么样的框架才能使这成为可能?