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

9

最近关于iCloud和Core Data的问题引起了很多讨论,苹果的API在iOS 5和可能的iOS 6中目前存在问题。

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

如果可以,请问如何操作?如果不行,请推荐其他方法。


这些看起来不错 - 点击链接查看: > Core Data iCloud 教程
http://www.raywenderlich.com/6031/beginning-icloud-in-ios-5-tutorial-part-2
http://blogs.captechconsulting.com/blog/mark-broski/ios-6-tutorial-series-syncing-coredata-across-devices-using-icloud
http://timroadley.com/2012/04/03/core-data-in-icloud/
- Undo
1
我已经使用它很长时间了,但从未达到过可以使用它来发布应用程序的程度。 - Tom Harrington
我一直密切关注iCloud的问题。我选择使用它,这篇文章提出了一个很好的理由,即使它能正常工作:为什么开发者不应该使用iCloud NSHipster在愚人节发表了一篇关于iCloud“乐趣”的好文章:iCloud - bastidiasRN
@TomHarrington你的说法即使在最新的iOS 6.1版本中也适用吗?我已经在App Store上看到了一些应用程序,只要你的数据模型不太复杂,就可以使用iCloud同步。 - iwasrobbed
1
@iWasRobbed 如果你非常仔细地检查数据以确保其正确,那么它可能在这种情况下起作用。即使它正常工作,也有许多复杂因素,我最近在我的博客上进行了介绍。 - Tom Harrington
4个回答

6
这篇博客文章将引导您阅读一系列关于开发人员尝试使用iCloud同步的困难的近期文章。
根据我的个人理解和经验,我认为这是可行的,但不要认为你会得到任何免费的东西。根据您的数据模型,您可能最好将整个持久性存储作为文档进行同步,而不是使用记录在文档中的核心数据/iCloud方法。
如果您已经熟悉Core Data,则可能会更有运气。只需确保您考虑了如何处理几个重要的情况。
一个是如果用户退出其iCloud帐户该怎么办。当发生这种情况时,本地的全局持久存储将被删除。如果对于用户仍然可以访问其数据是有意义的,则需要管理本地存储中的副本,并在他们重新登录时管理重新同步。
另一个问题是更改似乎默认情况下传播速度很慢,因此您可能需要考虑替代机制(例如键值存储)来快速传播足够的信息以避免不良用户体验。
冲突管理可能是最具挑战性的问题(取决于您的模型)。虽然框架提供了一种机制来告知您冲突,但您必须自己提供解决机制,并且有报告称冲突通知可能不可靠(请参见链接的文章),这似乎与更新延迟密切相关。
简而言之,如果您了解实际支持非常基本,并且需要非常谨慎地编码,那么您可能有机会。目前没有好的解决方案,因此,如果您成功了,请回来告诉我们什么有效。

4
这取决于你想做什么。有两种类型的Core Data-iCloud集成,如此处所述:http://developer.apple.com/library/ios/#releasenotes/DataManagement/RN-iCloudCoreData/_index.html 一般来说,有两种类型的基于Core Data的应用程序与iCloud集成:
图书馆式应用程序,其中应用程序通常只有一个持久存储库,并且从存储库中使用数据贯穿整个应用程序。此类应用程序的示例是音乐和照片。
文档型应用程序,其中可以在应用程序的生命周期内不同时间打开不同的文档。此类应用程序的示例是Keynote和Numbers。
如果您正在使用库类型,则本文是系列文章的第一篇,涉及许多可能出现的问题:http://mentalfaculty.tumblr.com/post/23163747823/under-the-sheets-with-icloud-and-core-data-the-basics

您还可以查看今年wwdc的218号(针对基于文档的)或227号(针对库式)会话。


2
截至iOS 7,最好的解决方案可能是Ensembles框架:https://github.com/drewmccormack/ensembles。此外,还有一个有前途的项目,基本上可以让您使用不同的云服务完成相同的事情。以下是存储库链接:https://github.com/nothirst/TICoreDataSync
项目描述:
TICoreDataSync是一组类,可通过云(包括Dropbox)在运行Mac OS X或iOS下的任意数量的客户端之间同步基于Core Data的应用程序(包括文档型应用程序)。如果需要通过尚未受支持的选项进行同步,则设计为易于扩展。
iCloud目前不可靠的原因:
- "有时,iCloud无法将数据从一台计算机移动到另一台计算机。" - "损坏的基线是[一个]常见障碍....没有从损坏的基线中恢复的方法,除了深入挖掘本地iCloud存储的内部并清除所有内容,而且没有明显的指示发生了损坏 - 同步只是停止了。" - "有时,在初始化iCloud应用程序子系统时,它会简单地返回不透明的内部错误。当它失败时,没有恢复选项 - 你所能做的就是一遍又一遍地尝试,直到最终成功。" - "在iCloud系统首选项中关闭“文档和数据”同步选项时,iCloud系统会删除所有本地存储的iCloud数据[。]" - 当您注销iCloud时,系统将您的iCloud数据移动到应用程序沙箱容器之外的位置,应用程序不能再使用它。 - "在某些情况下(我们还无法弄清楚哪些情况),iCloud实际上会更改项目的对象类别,从而同步它。粗略地描述,对象类别确定数据库中对象的类型[。]" - "在某些情况下(不是所有时间),iCloud可能会执行以下操作之一: - 项目数据中的所有者关系将指向错误的所有者; - 所有者项目在同步中丢失,永远不会出现在除创建它们的计算机以外的其他计算机上。(这导致该项从不出现在任何其他机器的UI中。)当发生这种情况时,blob项和任意不相关的所有者之间会创建虚假关系。" - "有时(没有任何明显的一致性或重复性),对象的关联数据(例如PDF项的PDF数据或Web Archive项的Web Archive数据)会在目标机器上简单地无法显示。有时它会稍后到达(要花费很长时间 - 分钟或小时)。
以上内容引自以下来源:

注意: 我看过一篇文章,作者提到可以在 iOS 6+ 上使它工作,但是他们没有提供任何示例:为什么你想使用 Core Data iCloud 同步,如果只有它的话


以下是苹果关于 iCloud + Core Data 的文档:

这是一个示例应用程序:


1

你可以从Apple开发者教程开始学习如何使用iCloud API来操作文档。

《Your Third iOS App》介绍了iCloud文档存储API。您可以使用这些API在用户的iCloud存储中存储和操作文件。


尽管我的理解有限,但我认为自从这次讨论开始以来,iCloud API已经发生了重大变化。看起来苹果iCloud开发者网站是一个很好的起点。 - Alex

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接