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

时间:2012-08-17 19:27:58

标签: ios core-data ios6 sync icloud

关于iCloud和Core Data的问题已经a lot of discussion lately以及Apple的API在iOS 5和iOS 6中如何被破坏。

鉴于Apple核心数据API的当前状态,是否可以使用iCloud在多个设备之间可靠地同步?

如果是这样,你会怎么做?如果没有,请推荐另一种方法。

4 个答案:

答案 0 :(得分:6)

这篇blog post将引导您阅读一系列关于开发人员尝试这种方法的最新文章。

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

如果您已经熟悉Core Data,那么您可能会有更好的运气。请务必考虑如何处理几个重要案例。

如果用户退出iCloud帐户,则可以执行以下操作:发生这种情况时,将删除本地无处不在的持久存储。如果用户仍然可以访问他们的数据,则需要在本地存储中管理副本,然后在他们重新登录时管理重新同步。

另一个原因是默认情况下传播的变化显然很慢,因此您可能需要考虑一种替代机制,例如键值存储,以快速传播足够的信息以避免糟糕的用户体验。

冲突管理可能是最具挑战性的(取决于您的模型)。虽然框架提供了一种通知您冲突的机制,但您可以自行提供解决冲突的机制,并且有报告称冲突通知可能不可靠(请参阅链接文章),这似乎与延迟密切相关在更新。

简而言之,如果你进入这种理解,实际的支持是非常简单的,并且你需要非常防御性地编码,你可能有机会。那里没有任何好的食谱,所以如果你确实有效,请回来告诉我们什么有效!

答案 1 :(得分:4)

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

  

从广义上讲,有两种基于核心数据的应用程序与iCloud集成:

     

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

     

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

如果你正在使用库类型,那么这篇文章是系列中的第一篇,它将涉及许多问题:http://mentalfaculty.tumblr.com/post/23163747823/under-the-sheets-with-icloud-and-core-data-the-basics

您还可以查看今年wwdc的会议218(基于文档)或227(库类型)。

答案 2 :(得分:2)

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

此外,还有一个很有前景的项目,它基本上允许您使用不同的云服务执行相同的操作。

以下是存储库的链接:https://github.com/nothirst/TICoreDataSync

项目说明:

  

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

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

  • “有时,iCloud无法将数据从一台计算机移动到另一台计算机。”
  • “损坏的基线是[a]常见的障碍......没有从损坏的基线恢复,没有挖掘到本地iCloud存储的内部并刮掉所有内容,并且没有明显的迹象表明腐败已经发生 - 同步只是停止。“
  • “有时,在初始化iCloud应用程序子系统时,它只会返回一个不透明的内部错误。当它失败时,没有恢复选项 - 你所能做的只是再试一次(并再次......),直到它最终有效。”
  • “当你关闭iCloud系统首选项中的”文档和数据“同步选项时,iCloud系统会删除所有本地存储的iCloud数据[。]”
  • 当您退出iCloud时,系统会将您的iCloud数据移动到应用程序沙盒容器之外的位置,并且应用程序将无法再使用它。
  • “在某些情况下(我们还未能弄清楚哪个),iCloud在同步时实际上更改了项目的对象类。松散地描述,对象类确定了对象的类型。数据库[。]“
  • “在某些情况下(同样,并非所有时间),iCloud可能会执行以下操作之一:
    • 项目数据中的所有者关系将指向错误的所有者;
    • 所有者项目在同步中丢失,并且永远不会出现在创建它们的计算机之外的计算机上。 (这导致项目永远不会出现在任何其他计算机的UI中。)当发生这种情况时,会在blob项目和任意无关的所有者之间创建虚假关系。“
  • “有时(没有任何明显的一致性或可重复性),对象的关联数据(例如,PDF项目的PDF数据或Web存档项目的Web存档数据)将无法显示在目的地机器。有时它会晚到(很久以后 - 几分钟或几小时)。“

引用并转述这些来源:

注意:我看过一篇文章,其中作者提到让它适用于iOS 6+,但它们没有提供任何示例:http://zaal.tumblr.com/post/46718877130/why-you-want-to-use-core-data-icloud-sync-if-only-it


作为参考,以下是Apple关于iCloud +核心数据的文档:

这是一个示例应用程序:

答案 3 :(得分:1)

Apple developer tutorial on using the iCloud API to manipulate documents可能是一个很好的起点。

  

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