5

我正在开发我的第一个“iCloud App”。我研究了 Apple 文档和斯坦福视频,但我仍然难以理解 iCloud 的“大局”。

我的目标是创建一个“图书馆风格”应用程序(这是 Apple 对具有“具有单个持久存储协调器和单个持久存储的单个核心数据堆栈”的应用程序的术语),例如员工示例

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

这已经是我纠结的第一件事:“存储在云端”到底是什么意思?

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

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

我的第一个假设(本地文件+云中的副本)并非完全错误。事实上,存储在云中的任何文件都有“本地版本”和“云版本”。这是因为即使设备当前没有 Internet 连接,我也可以访问 iCloud URL 并将文件存储在此位置。但这只是 iCloud 框架的神奇之处,我无需费心。从我的角度来看,云只是一个特殊的文件夹,该文件夹中的任何文件或目录都存储在云中。如果在设备设置中禁用了 iCloud,则 iCloud URL 将为 NIL。那正确吗?

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

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

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

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

非常感谢!

4

2 回答 2

2

一般来说,我可以推荐阅读iCloud 设计指南- 特别是“为 iCloud 中的文档设计”部分。

至于你的问题:

  • “存储在云端”的真正含义是什么?

    如果您在斯坦福视频之后使用 UIManagedDocument,您的应用程序将在添加/编辑/删除数据时上传更改日志。但是,您的设备有一种“iCloud 缓存”,它存储 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 文件夹。

于 2013-03-02T11:44:43.477 回答
-1

对于仍在苦苦挣扎的人,请尝试此站点。

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

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

于 2014-02-09T10:27:22.537 回答