在Mac和iPhone之间同步核心数据模型

在Mac和iPhone之间同步核心数据模型,iphone,objective-c,macos,core-data,sync,Iphone,Objective C,Macos,Core Data,Sync,我目前正在构建我的核心数据模型,我想在我的应用程序的Mac和iPhone版本之间进行同步 我将使用Bonjour进行设备发现等,但我对问题中的数据同步部分有疑问 到目前为止,我已经为同步中涉及的每个对象添加了UID和修改时间戳,因此我应该能够匹配对象并检测哪些对象已经更改 关于为这种情况编写同步代码(即在一个模型的两个实例之间同步记录),是否有好的链接和参考资料 同步是一个相当多的边缘案例的问题,在过去人们已经解决了很多次,所以我希望找到一些关于这个主题的信息,但我能找到的只是苹果的同步服务(i

我目前正在构建我的核心数据模型,我想在我的应用程序的Mac和iPhone版本之间进行同步

我将使用Bonjour进行设备发现等,但我对问题中的数据同步部分有疑问

到目前为止,我已经为同步中涉及的每个对象添加了UID和修改时间戳,因此我应该能够匹配对象并检测哪些对象已经更改

关于为这种情况编写同步代码(即在一个模型的两个实例之间同步记录),是否有好的链接和参考资料

同步是一个相当多的边缘案例的问题,在过去人们已经解决了很多次,所以我希望找到一些关于这个主题的信息,但我能找到的只是苹果的同步服务(iPhone上不存在)和一些MS Sync技术的链接


我真的在寻找一般的理论,这样我就可以自己实现它,不一定是现成的解决方案。

SyncML规范可能会有所帮助,但它很难阅读,而且显然偏向于SyncML

我必须为Task Coach实现这一点,因此以下是一些想法:

修改标志就足够了,时间戳并不能提供更多的信息。通常,我的对象处于以下状态之一:

  • 没有
  • 新的
  • 删除
  • 修改
修改对象时会发生以下转换:

  • 无->修改
  • 新建->新建
  • 已删除->(不应发生)
  • 修改->修改
以及删除时的以下内容:

  • 无->删除
  • 新建->实际删除(可能从存储器中删除)
  • 已删除->(不应发生)
  • 修改->删除
同步时,设备首先向桌面发送状态不同于“无”的所有对象。如果其中一个具有状态,桌面将要求用户解决冲突!=没有人站在它一边。在任何情况下,对象在设备上都会进入“无”状态,或者如果其状态已被删除,则会从存储器中删除

然后,桌面将自己的更改发送到设备。由于设备上的所有对象都处于“无”状态,因此不可能存在冲突。桌面上的对象进入无状态或从存储中删除,同步结束

根据设备/桌面状态,可能存在两种类型的冲突:

  • 修改/删除。如果用户选择信任设备,桌面对象将替换为设备对象;否则,桌面将不执行任何操作并保持已删除状态,以便在第2阶段将对象从设备中删除
  • 删除/修改:如果设备获胜,则该对象实际上已从桌面上删除。否则,对象将在桌面上进入新状态,以便在第2阶段在设备上恢复
  • 删除/删除:Duh。只需将其从存储器中取出即可
  • 修改/修改:用户决定保留哪些值,可能是基于字段。桌面上的状态保持为“已修改”,以便在第2阶段将这些选择传播回设备
如果为每个字段保留修改状态,则可以避免某些冲突,例如,设备上具有修改主题的对象和桌面上的修改摘要不会触发冲突

您可以以TaskCoach的代码为例(SourceForge上的SVN存储库,它有Python中的桌面应用程序和iPhone应用程序)。实际上,在这种情况下,我决定使用一种更简单的方法;我没有在桌面上记录状态。在第1阶段(设备到桌面)之后,我只是将设备上的对象完全替换为桌面上的对象。因此,没有冲突(设备总是赢)

显然,这只在两个固定设备之间起作用;如果你想与多个手机/桌面应用程序同步,你必须为每个手机/桌面应用程序分配一个唯一的ID,并为不同的设备/应用程序保持不同的状态。这可能开始变得毛茸茸的


HTH

Marcus Zarra创建了一个名为简化iPhone/iPad应用程序与Mac应用程序同步的框架。看一看,这可能有助于解决问题

时间戳有助于区分两个设备上的并发编辑。如果你只是使用布尔“修改”标志,那么很难知道哪一个是最新的数据。感谢fraca7,这正是我想要的。我还将查看SyncML文档,看看它们是否涉及此类细节。还有其他建议吗?AlBlue:如果你想要某种自动解决冲突的方法,我宁愿问用户。如果两个记录都被修改了,他应该是决定者。将近一年后,我认为fraca7的回答最接近地回答了这个问题,尽管在这种情况下,我希望Marcus Zarra的ZSync框架能为我处理大部分问题。谢谢大家。谢谢约翰,我关注ZSync已经有一段时间了,我只是想先看看它在现实世界的应用程序中表现如何。这看起来是一个很棒的项目,可以很好地满足我的需求