UIManagedDocument + iCloud“大局”?

5
我正在开发我的第一个“iCloud 应用程序”。我已经阅读了苹果文档和斯坦福大学的视频,但我仍然难以理解 iCloud 的“大局”。我的目标是创建一个“Library style”应用程序(这是苹果术语,指具有“单个 Core Data 堆栈、单个持久性存储协调器和单个持久性存储”的应用程序),类似于 Employees example。按照斯坦福大学的视频,我使用 UIMangedDocument 来设置所有 Core Data 相关内容并启用 iCloud 功能。UIMangedDocument 包含数据库并“存储在云中”。这已经是我遇到的第一个问题:“存储在云中”真正意味着什么? 在开始使用iCloud之前,我认为“将文档存储在云中”意味着“在云中存储文档的副本”。我认为常规沙箱内会有本地版本的文档以及云中的文档副本。每当修改本地文件时,这些更改也会传输到云中的版本。现在我理解这样不正确(至少不完全正确)。我是对的吗?
要使用iCloud的第一件事情是调用URLForUbiquityContainerIdentifier:。这将返回“iCloud URL”,即云中文件夹的URL。存储在此URL下的所有文件都将“存储在云中”,对吗?
我的第一个假设(本地文件+云端复制)并不完全错误。实际上,任何存储在云中的文件都有“本地版本”和“云版本”。这是因为我可以访问iCloud URL并将文件存储在此位置,即使设备当前没有互联网连接。但这只是iCloud框架的魔法,与我无关。从我的角度来看,云只是一个特殊的文件夹,此文件夹中的任何文件或目录都存储在云中。如果在设备设置中停用了iCloud,则iCloud URL将为空值。对吗?
我所困扰的第二件事是iCloud如何同步文档的更改。假设设备A上的“TheApp”创建了一个UIManagedDocument并将其存储在云中。之后,设备A离线了。同时,设备B上的TheApp访问该文档并添加了一些数据(例如,插入了一些新员工或部门)。当设备B再次联机时,它将接收到NSPersistentStoreDidImportUbiquitousContentChangesNotification,并且可以在文档的managedObjectContext上调用mergeChangesFromContextDidSaveNotification:来合并所有这些更改。
我无法确定合并更改是否真的必要。如上所述,从我的角度来看,只有一个文档。如果这是真的,那么通知我有关更改是很好的,但不需要将这些更改复制到文档的“本地版本”中,因为不存在“本地版本”这样的东西。这使我想到了mergeChangesFromContextDidSaveNotification:有什么用。 另一种情况是与之前相同的情况(在设备A上创建文档,在设备B上更改...),但现在设备A不仅处于离线状态,而且在设备B进行更改时TheApp完全关闭。在这种情况下,设备A上的TheApp将不得不在再次启动后重新创建/打开文档。在这种情况下应该发生什么?
我进行了一些测试,但结果并不总是相同。在某些情况下,文档以其“旧”版本启动,然后接收到带有更改的通知。在其他情况下,文档直接以其新版本启动,并携带所有更改。对于我的应用程序,第一种情况(以旧版本启动,接收更新通知)会更好,但我无法强制执行其中任何一种行为。这就是它应该工作的方式吗?
非常感谢!
2个回答

1
一般而言,我建议阅读iCloud设计指南 - 特别是"为iCloud中的文档设计"部分。
至于你的问题:
  • "存储在云端" 究竟是什么意思?

    如果您正在使用 UIManagedDocument 并遵循斯坦福大学的视频,当数据被添加/编辑/删除时,您的应用程序将上传更改日志。但是,您的设备有一种“iCloud缓存”,它存储 iCloud 数据并从中访问(即使您离线或甚至在删除并重新安装应用程序时也可以访问该文件夹)。如果您使用 NSMetadataQuery 记录 iCloud 文件夹中文档的 URL(您应该使用这个方法),您会在本地设备上获得 iCloud 文件的路径,即

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

    因此,在首次启动应用程序或每次启动应用程序时访问 iCloud 上的 UI(Managed)Documents 时,您需要考虑许多事情(例如,iCloud 是否可用,您是否有网络连接等)。

    然而,按照视频的方式,您的应用程序沙盒和 iCloud 中不会有单独的文档(当然,您可以通过将文档保存到 iCloud URL 和应用程序沙盒中的本地 URL 来实现此目的)。

  • 合并更改的需求

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


-1

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