再次陷入iCloud :(。我正在使用Core Data + iCloud,在我的应用程序中,我想知道用户是否关闭了他的帐户中的文档和数据。 感谢
答案 0 :(得分:2)
没有内置支持来检测此更改,仅用于检测用户是否已注销。一种常见的方法是将一个sentinel文件写入iCloud,与Core Data分开,然后监视该文件以查看它是否消失。细节有所不同,但通常是这样的:
使用NSFileManager
iCloud调用编写文件,并将文件名存储在用户默认值中。使用该帐户的每个设备都会有不同的文件,因此在文件名中包含UUID是个不错的主意。你只写这个文件,你永远不会改变它。
使用NSFilePresenter
或NSMetadataQuery
通知该文件的更改 - 如果它已消失。
如果文件消失,请立即执行卸载整个Core Data堆栈的步骤,包括每个托管对象,因为它们没有持久存储来备份它们。
一个示例实现位于Black Pixel's version of the Core Data "Recipes" demo app。您可能需要调整它以使其在您的代码中正常工作。
答案 1 :(得分:1)
有两种情况:
此处的解决方案是使用NSUserDefaults(或应用程序本地的其他一些存储)来存储/比较身份令牌。从NSFileManager获取身份令牌,并在每次应用程序完成启动或返回前台时将其与缓存值进行比较。
id token = [[NSFileManager defaultManager] ubiquityIdentityToken];
这需要一个文件展示器来容器内的“东西”。最佳解决方案是使用未同步的文件。
实现-accommodatePresentedItemDeletionWithCompletionHandler:生成一个线程(dispatch_async效果很好)并进行清理工作。