CloudKit:基于CKQueryNotification删除本地对象

Jor*_*416 8 core-data ios icloud swift cloudkit

我正在构建一个严重依赖CloudKit进行数据同步的应用程序.每次应用程序启动时,它都会捕获使用a在服务器上进行的所有更改CKFetchNotificationChangesOperation.这会成功返回已创建和/或修改的所有对象,但我现在处于这个阶段,我还希望我的应用程序根据这些消息删除记录.

在我的应用程序中,我存储在CoreData中的每个对象也携带该对象的在线表示的recordID.这样我就可以轻松获取需要修改的对象.

删除对象时这似乎很难,因为CloudKit只返回这些对象的recordID,并且不提供我可以用来知道我在CoreData数据库中查找的对象的recordType.

在具有多种记录类型的情况下,如何正确处理CloudKit"已删除"通知?

Tom*_*ton 4

如果 CloudKit 没有向您提供任何已删除记录类型的指示,那么处理起来会很麻烦。在不知道实体类型的情况下,您无法删除 Core Data 中的对象,因此如果 CloudKit 没有给您任何线索,那么您需要检查可能具有recordId.

删除过程与通常的 Core Data 相同。使用诸如“recordId = %@”之类的谓词执行获取请求来查找匹配的对象。如果找到一个,请将其删除。除非您必须对每个潜在实体重复此操作。

一种可能有帮助的方法是将 存储recordId在一个新的、单独的实体中。创建一个名为明显的新实体CKRecordInfo,并将其保留recordId在那里。具有 CloudKit 信息的每个其他实体都与该实体具有一对一的关系。通过此设置,您将获取新实体的实例CKRecordInfo,并删除与其相关的任何对象。

但与此同时,我还没有使用过 CloudKit,令人惊讶的是它只提供了有关记录类型的信息recordId,而没有任何信息。如果可能的话,从通知中获取信息将是理想的选择。