【发布时间】:2013-05-25 16:43:48
【问题描述】:
再次卡在 iCloud 中 :(。我正在使用 Core Data + iCloud,在我的应用程序中,我想知道用户是否从他的帐户中关闭了文档和数据。 谢谢
【问题讨论】:
标签: iphone ios ipad core-data icloud
再次卡在 iCloud 中 :(。我正在使用 Core Data + iCloud,在我的应用程序中,我想知道用户是否从他的帐户中关闭了文档和数据。 谢谢
【问题讨论】:
标签: iphone ios ipad core-data icloud
没有用于检测此更改的内置支持,仅用于检测用户是否已注销。一种常见的方法是将标记文件写入 iCloud,与 Core Data 分开,然后监视该文件以查看它是否消失。细节各不相同,但通常是这样的:
使用NSFileManager iCloud 调用写入文件,并将文件名存储在用户默认值中。使用该帐户的每个设备都有不同的文件,因此在文件名中包含 UUID 是个好主意。你只写这个文件,你永远不会改变它。
使用NSFilePresenter 或NSMetadataQuery 来获得有关该文件更改的通知——例如,如果它消失了。
如果文件消失,请立即采取措施卸载整个 Core Data 堆栈,包括每个托管对象,因为它们不再有持久性存储来备份它们。
Black Pixel's version of the Core Data "Recipes" demo app 中有一个示例实现。您可能需要对其进行调整以使其在您的代码中正常工作。
【讨论】:
有两种情况:
这里的解决方案是使用 NSUserDefaults(或应用程序本地的一些其他存储)存储/比较身份令牌。每次应用完成启动或返回前台时,从 NSFileManager 获取身份令牌并将其与缓存值进行比较。
id token = [[NSFileManager defaultManager] ubiquityIdentityToken];
这需要一个文件展示者在容器内“做某事”。最好的解决方案是使用未同步的文件。
实施 -accommodatePresentedItemDeletionWithCompletionHandler: 生成一个线程(dispatch_async 效果很好)并进行清理工作。
【讨论】: