要使用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将不得不在再次启动后重新创建/打开文档。在这种情况下应该发生什么?
我进行了一些测试,但结果并不总是相同。在某些情况下,文档以其“旧”版本启动,然后接收到带有更改的通知。在其他情况下,文档直接以其新版本启动,并携带所有更改。对于我的应用程序,第一种情况(以旧版本启动,接收更新通知)会更好,但我无法强制执行其中任何一种行为。这就是它应该工作的方式吗?
非常感谢!