UIManagedDocument + iCloud“大图”?

时间:2012-03-27 08:18:13

标签: core-data icloud uimanageddocument

我正在制作我的第一个“iCloud App”。我通过Apple文档和斯坦福视频工作,但我仍然在努力理解iCloud的“大图”。

我的目标是创建一个“Library style”应用程序(对于具有“具有单个持久性存储协调器和单个持久性存储的单个Core数据堆栈”的应用程序的Apples术语),如{{3 }}

在斯坦福视频之后,我使用UIMangedDocument设置所有Core Data内容并启用iCloud功能。 UIMangedDocument包含数据库,并“存储在云端”。

这已经是我挣扎的第一件事:“存储在云端”的真正意义是什么?

在我开始使用iCloud之前,我认为“将文档存储在云中”意味着“将文档的副本存储在云中”。我以为在常规沙箱中会有我的文档的本地版本以及云中文档的副本。当更改本地文档时,这些更改也会转移到云版本。据我所知,现在这是不正确的(至少不完全正确)。我是对的吗?

使用iCloud我要做的第一件事就是调用 URLForUbiquityContainerIdentifier:。这将返回“iCloud URL”,表示云中文件夹的URL。存储在此URL下的所有文件都将“存储在云端”,对吧?

我的第一个假设(本地文件+云中的副本)并非完全错误。事实上,存储在云中的任何文件都有“本地版本”和“云版本”。这是因为即使设备当前没有Internet连接,我也可以访问iCloud URL并在此位置存储文件。但这只是iCloud框架的魔力背后,我不得不打扰。从我的角度来看,云是一个特殊的文件夹,该文件夹中的任何文件或目录都存储在云端。如果在设备设置中停用iCloud,则iCloud URL将为NIL。 是吗?

我讨论的第二件事是iCloud如何将更改同步到Document。假设设备A上的“TheApp”创建了一个UIManagedDocument并存储在云中。设备A离线后。同时,TheApp在设备B上访问该文档并添加一些数据(例如,插入一些新的员工或部门)。当设备B再次联机时,它将收到 NSPersistentStoreDidImportUbiquitousContentChangesNotification ,并且可以合并文档的managedObjectContext上的所有调用 mergeChangesFromContextDidSaveNotification:以复制这些更改。

我无法确定是否真的需要合并这些更改。如上所述,从我的角度来看,只有一份文件。如果这是真的,我很高兴收到有关更改的通知,但是没有必要将这些更改复制到文档的“本地版本”,因为没有“本地版本”这样的东西。 这让我想到了mergeChangesFromContextDidSaveNotification有什么好处的问题。

另一种情况与之前的情况相同(在设备A上创建的文档,在设备B上更改...)但是现在设备A不仅仅是脱机,而是在设备B上进行更改时完全关闭了TheApp。在这种情况下,设备A上的TheApp必须在再次启动文档后重新创建/重新打开文档。在这种情况下,应该会发生什么?

我确实进行了一些测试,但结果并不总是一样。在某些情况下,文档以其“旧”版本开始,而不是通过更改收到通知。在其他情况下,文档直接在其新版本中开始,并且所有更改都在船上。对于我的应用程序,第一种情况(从旧版本开始,接收更新通知)会更好,但我无法强制执行一种或另一种行为。这是它应该工作吗?

非常感谢!

2 个答案:

答案 0 :(得分:1)

通常我建议您阅读iCloud Design Guide - 特别是"Designing for Documents in iCloud"部分。

关于你的问题:

  • “存储在云中”真正意味着什么?

    如果您在斯坦福视频之后使用UIManagedDocument,您的应用程序将在添加/编辑/删除数据时上传更改日志。但是,您的设备有一种“iCloud Cache”,它存储iCloud数据并从中访问(当您离线或甚至删除并重新安装应用程序时,您可以访问该文件夹)。如果NSLog iCloud文件夹中文档的URL(您应该使用NSMetadataQuery执行此操作,则可以在设备上本地获取iCloud文件的路径,这是

    /private/var/mobile/Library/Mobile Documents/<Developer identifier>/<App identifier>/...

    出于这个原因,在首次启动应用程序或每次启动应用程序时访问iCloud上的UI(托管)文档时,您需要考虑一些事情(例如,iCloud可用,您是否有网络连接? ,...)。

    但是,按照视频的方式,您的应用沙箱和iCloud中不会有单独的文档(当然,在将文档保存到iCloud URL以及本地URL时,您可以实现此目的。应用程序沙箱)。

  • 需要合并更改

    如上所述,您的设备正在保存更改日志,其中包括对文档的添加/编辑/删除。这些更改日志将上载到iCloud,并由连接到同一iCloud帐户的其他设备下载。每个设备都可以使用更改日志重建数据模型的当前状态。这使得iCloud极其高效(每次完整上传需要更长的时间)。关于这些更改的同步过程,我还可以参考iCloud设计指南。简而言之,每次返回在线模式时,您都必须考虑设备同步本地iCloud文件夹。

答案 1 :(得分:-1)

对于仍在努力的人来说,试试这个网站。

http://ossh.com.au/design-and-technology/software-development/

iOS和OSX的示例应用程序包括iCloud集成,备份,iCloud同步状态等。