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