我正在开发我的第一个“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 上的文档在再次启动后必须重新创建/重新打开。在这种情况下应该怎么办?
我确实进行了一些测试,但结果并不总是相同。在某些情况下,文档从其“旧”版本开始,然后收到更改通知。在其他情况下,该文档直接在其新版本中开始,所有更改都已包含在内。对于我的应用程序,第一种情况(从旧版本开始,接收更新通知)会更好,但我无法强制其中一种行为。这是它应该工作的吗?
非常感谢!