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