使用 iCloud 在多台设备上同步 Core Data
Posted
技术标签:
【中文标题】使用 iCloud 在多台设备上同步 Core Data【英文标题】:Syncing Core Data across multiple devices using iCloud 【发布时间】:2012-08-17 19:27:57 【问题描述】:关于 iCloud 和 Core Data 的问题以及 Apple 的 API 目前在 ios 5 和可能的 iOS 6 中如何被破坏,a lot of discussion lately 一直存在。
考虑到 Apple 核心数据 API 的当前状态,是否有可能使用 iCloud 在多个设备之间可靠地同步?
如果是这样,你会怎么做?如果没有,请推荐一种替代方法。
【问题讨论】:
这些看起来不错 - 看看它们:> Core Data iCloud 教程 > >raywenderlich.com/6031/… > blogs.captechconsulting.com/blog/mark-broski/… > timroadley.com/2012/04/03/core-data-in-icloud 我已经用它做了很多工作,但从来没有达到我会用它发布应用程序的地步。 我一直在密切关注 iCloud 问题。我选择了不来使用它,这篇文章很好地说明了不使用 iCloud,即使它有效:Why Developers Shouldn't Use iCloudNSHipster 刚刚在“欢乐”上做了一篇很好的愚人节帖子iCloud 的:iCloud @TomHarrington 你的说法是否适用于最新的 iOS 6.1 版本?只要您的数据模型不太复杂,我已经在 App Store 上看到了几个使用 iCloud 同步的应用程序。 @iWasRobbed 它可能在这种情况下有效,但您需要非常仔细查看数据以确保其正确。即使它工作正常,也有许多复杂的因素,I have been covering recently on my blog 【参考方案1】:此blog post 将引导您查看一系列最近的文章,这些文章介绍了尝试这种方法的开发人员的艰辛。
根据我自己的理解和经验,我相信这是可行的,但不要相信你会“免费”获得任何东西。根据您的数据模型,您最好将整个持久性存储同步为文档,而不是使用文档化的核心数据/iCloud 方法。
如果您已经熟悉 Core Data,那么您的运气可能会更好。请务必仔细考虑如何处理几个重要案件。
如果用户退出其 iCloud 帐户,该怎么做。发生这种情况时,将删除本地无处不在的持久存储。如果用户仍然可以访问他们的数据是有意义的,那么您需要在本地存储中管理一个副本,然后在他们重新登录时管理重新同步。
另一个原因是,默认情况下更改的传播显然很慢,因此您可能需要考虑一种替代机制,例如键值存储,以快速传播足够的信息以避免不良的用户体验。
冲突管理可能是最具挑战性的(取决于您的模型)。虽然框架提供了一种通知您冲突的机制,但您需要自己提供一种机制来解决它们,并且有报告称冲突通知可能不可靠(请参阅链接文章),这似乎与滞后密切相关正在更新中。
简而言之,如果您了解实际的支持是非常简单的,并且您需要非常防御性地编写代码,那么您可能会有机会。那里没有任何好的食谱,所以如果你成功了,请回来告诉我们什么有效!
【讨论】:
【参考方案2】:这取决于你想做什么。有两种类型的 Core Data-iCloud 集成,如下所述:http://developer.apple.com/library/ios/#releasenotes/DataManagement/RN-iCloudCoreData/_index.html
与 iCloud 集成的基于 Core Data 的应用程序大致有两种类型:
图书馆风格的应用程序,其中应用程序通常有一个持久存储,并且来自存储的数据在整个应用程序中使用。 这种应用风格的例子是音乐和照片。
基于文档的应用程序,其中不同的文档可能在应用程序生命周期的不同时间打开。 这种应用风格的例子是 Keynote 和 Numbers。
如果您使用的是库类型,那么本文是系列文章的第一篇,该系列文章会涉及到许多将出现的问题:http://mentalfaculty.tumblr.com/post/23163747823/under-the-sheets-with-icloud-and-core-data-the-basics。
您还可以查看今年 wwdc 的第 218 场会议(基于文档)或 227 场(基于图书馆风格)。
【讨论】:
【参考方案3】:从 iOS 7 开始,最好的解决方案可能是 Ensembles 框架:https://github.com/drewmccormack/ensembles
此外,还有一个很有前途的项目,它基本上允许您使用不同的云服务来做同样的事情。
这里是存储库的链接:https://github.com/nothirst/TICoreDataSync
项目描述:
TICoreDataSync 是一个类的集合,可通过云(包括 Dropbox)在 Mac OS X 或 iOS 下运行的任意数量的基于 Core Data 的应用程序(包括基于文档的应用程序)之间实现同步。如果您需要通过尚不支持的选项进行同步,它的设计很容易扩展。
iCloud 目前不可靠的原因:
“有时,iCloud 无法将数据从一台计算机移动到另一台计算机。” “损坏的基线是 [a] 常见的障碍......没有从损坏的基线中恢复,除非深入挖掘本地 iCloud 存储的内部并将所有内容刮掉,并且没有明显的迹象表明损坏已发生 — 同步停止。” “有时,在初始化 iCloud 应用程序子系统时,它会简单地返回一个不透明的内部错误。当它失败时,没有恢复的选项 - 你所能做的就是再试一次(再一次……)直到它最终工作。” “[当您在 iCloud 系统偏好设置中关闭“文档和数据”同步选项时,iCloud 系统会删除您本地存储的所有 iCloud 数据[.]” 当您退出 iCloud 时,系统会将您的 iCloud 数据移动到应用程序沙盒容器之外的位置,并且应用程序无法再使用它。 “在某些情况下(我们还无法弄清楚是哪一种情况),iCloud 在同步项目时实际上会改变它的对象类。简单地说,对象类决定了对象的类型数据库[.]" “在某些情况下(同样,并非一直如此),iCloud 可能会执行以下操作之一: 项目数据中的所有者关系将指向错误的所有者; 所有者项目会在同步中丢失,并且永远不会出现在创建它们的计算机之外的计算机上。 (这会导致该项目永远不会出现在任何其他机器的 UI 中。)发生这种情况时,会在 blob 项目和任意不相关的所有者之间创建虚假关系。” “有时(没有任何明显的一致性或可重复性)对象的关联数据(例如,PDF 项目的 PDF 数据,或 Web 存档项目的 Web 存档数据)根本无法显示在目标机器。有时它会更晚到达(更晚——几分钟或几小时)。”引用自以下来源:
http://www.imore.com/debug-12-icloud-core-data-sync http://rms2.tumblr.com/post/46505165521/the-gathering-storm-our-travails-with-icloud-sync注意:我看过一篇文章,作者提到让它适用于 iOS 6+,但他们没有提供任何示例:http://zaal.tumblr.com/post/46718877130/why-you-want-to-use-core-data-icloud-sync-if-only-it
作为参考,这里是 Apple 关于 iCloud + Core Data 的文档:
http://developer.apple.com/library/ios/#releasenotes/DataManagement/RN-iCloudCoreData/ http://developer.apple.com/library/ios/#documentation/General/Conceptual/iCloudDesignGuide/Chapters/DesignForCoreDataIniCloud.html http://developer.apple.com/library/ios/#documentation/cocoa/Conceptual/CoreDataVersioning/vmCloud/vmCloud.html这是一个示例应用程序:
http://developer.apple.com/library/ios/#DOCUMENTATION/General/Conceptual/iCloud101/Introduction/Introduction.html【讨论】:
【参考方案4】:Apple developer tutorial on using the iCloud API to manipulate documents 可能是一个不错的起点。
您的第三个 iOS 应用程序向您介绍了 iCloud 文档存储 API。您可以使用这些 API 在用户的 iCloud 存储中存储和操作文件。
【讨论】:
虽然我的理解有限,但我认为自本次讨论开始以来,iCloud API 已经发生了显着变化。看起来Apple iCloud developer site 将是一个不错的起点。以上是关于使用 iCloud 在多台设备上同步 Core Data的主要内容,如果未能解决你的问题,请参考以下文章
iCloud Core Data 在 Xcode 6 / ios 8 SDK 中运行后不可用
Core Data 应用程序中的 UITableView 不会更新第二个设备的主视图,除非重新启动应用程序,并使用 iCloud 同步