我一直在研究一种在多台设备(如iPad或Mac)之间同步iPhone应用程序中存储的核心数据的方法.iOS上用于核心数据的同步框架并不多(如果有的话).然而,我一直在思考以下概念:

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

我需要考虑什么新奇的东西吗?我已经研究了REST框架,比如ObjectiveResourceCore ResourceRestfulCoreData.当然,这些都是与Ruby on Rails一起工作的,我不喜欢Ruby on Rails,但这是一个开始.我对解决方案的主要要求是:

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

我已经考虑了一些挑战:

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

我还遗漏了什么吗?要实现这一点,我应该考虑哪些类型的框架?

推荐答案

我建议仔细阅读和实施丹·格罗弗(Dan Grover)在iPhone2009大会上讨论的同步策略,该文档以pdf格式提供here.

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

File Synchronization with Vector Time Pairs

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

编辑:

Grover的pdf文件似乎不再可用(断开链接,2015年3月).更新:该链接可通过返回机here访问

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

Ios相关问答推荐

如何以最可靠的方式删除文本视图中的额外页边距?

SWIFT AVFoundation翻转相机功能不起作用

如何将模糊输入/模糊输出添加到SwiftUI中的非对称过渡?

为什么iOS委派在KMM中不能正常工作?

SwiftData共享扩展阻止应用程序打开SQLite文件

如何在Swift中同时实现三个手势?

无法关闭包含字体 Select 器的工作表

当目标位于菜单标签内时,matchedGeometryEffect 的行为很奇怪

SKScene 的更新功能似乎不起作用

无法在 CollectionView 中禁用部分弹跳 - 组合布局

使用 Foundation 解压缩文件

如何在 SwiftUI 中将选项卡放在滚动视图中?

'DismissAction'类型的值没有成员'wrappedValue'在SwiftUI的Xcode中

通过 iOS 创建和导出动画 gif?

如何在 Xcode 4 中切换 .h 和 .m

如何在 iOS 的 xib 中设置十六进制 colored颜色 代码

界面生成器中 UIView 的边框 colored颜色 不起作用?

如何启用滑动以删除 TableView 中的单元格?

无效的 iPhone 应用程序二进制文件

在 iOS 7 中更改返回按钮会禁用滑动导航返回