我正在开发我的第一个“iCloud 应用程序”。我浏览了 Apple 文档和斯坦福大学视频,但我仍然很难理解 iCloud 的“大局”。
我的目标是创建一个“图书馆风格 http://developer.apple.com/library/ios/#releasenotes/DataManagement/RN-iCloudCoreData/_index.html“应用程序(这是苹果公司对具有“单个核心数据堆栈、单个持久性存储协调器和单个持久性存储”的应用程序的术语),例如员工示例 https://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/CoreData/Articles/cdBasics.html.
在斯坦福大学视频之后,我使用 UIMangedDocument 来设置所有核心数据内容并启用 iCloud 功能。 UIMangedDocument 包含数据库并“存储在云中”。
这已经是我遇到的第一件事:“存储在云端”的真正含义是什么?
在我开始使用 iCloud 之前,我认为“在云中存储文档”意味着“在云中存储文档的副本”。我认为常规沙箱中会有我的文档的本地版本,并且云中会有该文档的副本。当本地文档发生更改时,这些更改也会传输到云版本。据我现在了解,这是不正确的(至少不完全正确)。我对吗?
使用 iCloud 我要做的第一件事就是打电话URLForUbiquityContainerIdentifier:。这将返回“iCloud URL”,这意味着云中文件夹的 URL。存储在该 URL 下的所有文件都将“存储在云端”,对吗?
我的第一个假设(本地文件+云中的副本)并不是完全错误的。事实上,存储在云中的任何文件都有“本地版本”和“云版本”。这是因为即使设备当前没有互联网连接,我也可以访问 iCloud URL 并将文件存储在该位置。但这只是 iCloud 框架的神奇之处,我不必担心。从我的角度来看,云只是一个特殊的文件夹,该文件夹中的任何文件或目录都存储在云中。仅当在设备设置中停用 iCloud 时,iCloud URL 才会为 NIL。是对的吗?
我遇到的第二件事是 iCloud 如何将更改同步到文档。假设设备 A 上的“TheApp”创建了一个 UIManagedDocument 并存储在云端。之后设备A离线。同时设备 B 上的 TheApp 会访问该文档并添加一些数据(例如插入一些新员工或部门)。当设备B再次上线时,会收到NSPersistentStoreDidImportUbiquitousContentChangesNotification并且可以合并所有呼叫mergeChangesFromContextDidSaveNotification:在文档的 ManagedObjectContext 上复制这些更改。
我无法确定合并更改是否真的有必要。如上所述,从我的角度来看,只有一个文档。如果这是真的,那么很高兴我收到有关更改的通知,但没有必要将这些更改复制到文档的“本地版本”,因为不存在“本地版本”之类的东西。这让我想到了 mergeChangesFromContextDidSaveNotification: 有什么好处的问题。
另一种情况与以前的情况相同(在设备 A 上创建文档,在设备 B 上更改...),但现在设备 A 不仅离线,而且在设备 B 上进行更改时 TheApp 完全关闭。在这种情况下,TheApp设备 A 上的文档再次启动后必须重新创建/重新打开该文档。什么should在这种情况下会发生什么?
我确实进行了一些测试,但结果并不总是相同。在某些情况下,文档以其“旧”版本开始,然后收到更改通知。在其他情况下,文档直接从新版本开始,并进行了所有更改。对于我的应用程序,第一种情况(从旧版本开始,接收更新通知)会更好,但我无法强制执行这种或另一种行为。这是它应该起作用的吗?
非常感谢!