使用iCloud在多个设备上同步核心数据

最近有很多讨论关于iCloud和Core Data的问题,以及苹果公司的API如何在iOS 5和iOS 6中破碎。

鉴于目前苹果的Core Data API的状态,是否有可能使用iCloud在多个设备间可靠地进行同步?

如果是这样,你会怎么做? 如果不是,请推荐一种替代方法。

这取决于你想要做什么。 有两种types的Core Data-iCloud集成,如下所述: http : //developer.apple.com/library/ios/#releasenotes/DataManagement/RN-iCloudCoreData/_index.html

广泛来说,有两种与iCloud集成的基于核心数据的应用程序:

库样式的应用程序,应用程序通常具有单个持久性存储,并在整个应用程序中使用来自存储的数据。 这种应用风格的例子是音乐和照片。

基于文档的应用程序,可以在应用程序的生命周期的不同时间打开不同的文档。 这种应用风格的例子是Keynote和Numbers。

如果你正在使用库types,这篇文章是系列中的第一个,它会遇到很多问题: http : //mentalfaculty.tumblr.com/post/23163747823/under-the-sheets -with-icloud-and-core-data-the-basics 。

你也可以检出今年wwdc的会议218(基于文件)或者227(库式)。

这篇博客文章将会引导您阅读最近关于尝试这种方法的开发者的艰辛的文章链。

从我自己的理解和经验来看,我认为这是可行的,但不要认为你会得到任何“免费”的东西。 根据您的数据模型,您可能最好将整个持久性存储同步为文档,而不是使用logging的核心数据/ iCloud方法。

如果你已经习惯了Core Data,那么你可能会有更好的运气。 只要确定你想通过如何处理几个重要的案例。

一个是如果用户注销他们的iCloud帐户,该怎么做。 发生这种情况时,本地无处不在的持久性存储被删除。 如果用户仍然有权访问其数据,则需要在本地存储中pipe理副本,然后在重新login时pipe理重新同步。

另一个原因是,默认情况下,更改可能会很慢传播,因此您可能需要考虑替代机制(例如,键值存储),以便快速传播足够的信息以避免不良的用户体验。

冲突pipe理也许是最具挑战性的(取决于你的模型)。 虽然框架提供了一个机制来告诉你冲突,但是你自己提供一个解决冲突的机制,而且有报告说冲突通知可能不可靠(见链接的文章),这似乎与滞后在更新。

简而言之,如果你了解到实际的支持是相当枯燥的,而且你需要非常防守的代码,那么你可能有机会。 那里没有任何好的食谱,所以如果你确实做到了,请回来告诉我们什么可行!

从iOS 7开始,最好的解决scheme可能是Ensembles框架: https : //github.com/drewmccormack/ensembles

另外,还有一个很有希望的项目,它基本上允许你使用不同的云服务来做同样的事情。

这是一个链接到存储库: https : //github.com/nothirst/TICoreDataSync

项目介绍:

TICoreDataSync是一组类,用于在任何数量的在Mac OS X或iOS下运行的客户端之间通过基于Core Data的应用程序(包括基于文档的应用程序)的云(包括Dropbox)启用同步。 如果您需要通过尚未支持的选项进行同步,则devise为易于扩展。

为什么iCloud目前不可靠的原因:

  • “有时,iCloud根本无法将数据从一台电脑移到另一台电脑。”
  • “损坏的基线是一个共同的障碍……没有从损坏的基线中恢复,也没有深入挖掘当地iCloud存储的内部并把所有东西都挖出来,也没有明显的迹象表明已经发生了腐败 – 同步就停止了。“
  • 有时,在初始化iCloud应用程序子系统时,它只会返回一个不透明的内部错误,当它失败时,没有select可以恢复,只能再次尝试(再一次…),直到最终起作用。
  • “当您closuresiCloud系统偏好设置中的”文档和数据“同步选项时,iCloud系统会删除所有本地存储的iCloud数据[。]”
  • 当您退出iCloud时,系统会将您的iCloud数据移动到您应用程序的沙箱容器之外的位置,并且应用程序不能再使用它。
  • “在某些情况下(我们还没有弄清楚是哪一个),iCloud在同步它的时候实际上改变了一个项目的对象类别,松散地描述,对象类别决定了数据库中对象的types。 ]”
  • “在某些情况下(不是全部),iCloud可能会执行以下操作之一:
    • 项目数据中的所有者关系将指向错误的所有者;
    • 所有者项目同步丢失,并且不会出现在创build它们的计算机之外的计算机上。 (这会导致该项目永远不会出现在任何其他机器的用户界面中)。发生这种情况时,会在blob项目和任意无关的所有者之间build立虚假关系。
  • “有时(没有任何明显的一致性或可重复性),对象的关联数据(例如PDF项目的PDF数据或Web存档项目的Web存档数据)将无法显示在目标机器上有时会迟到(稍后 – 几分钟或几小时)。“

从这些来源引用和转述:

注意:我看过一篇文章,作者提到它在iOS 6+上工作,但是他们没有提供任何示例:http: //zaal.tumblr.com/post/46718877130/why-you-want-to次使用的核-数据- icloud的同步-如果仅-它


作为参考,这里是苹果的文档在iCloud +核心数据:

这里是一个示例应用程序:

关于使用iCloud API处理文档的Apple开发者教程可能是一个很好的开始。

您的第三个iOS应用程序向您介绍了iCloud文档存储API。 您可以使用这些API来存储和操作用户的iCloud存储中的文件。