如何将 CKQueryNotification 连接到 CKRecord 或 CKSubsription?

How to connect CKQueryNotification to a CKRecord or CKSubsription?

我需要一种方法将 CKQueryNotification 连接到 CKRecord 或 CKSubscription,这样我就可以在多种记录类型上接收 updates/inserts/deletes。我已成功接收到 CKNotifications,这是有效载荷:

{
    ck =     {
        ce = 2;
        cid = "<my cloud container id>";
        nid = "<unknown guid>";
        qry =         {
            dbs = 2;
            fo = 1;
            rid = "<the record id>";
            sid = "<THIS IS THE SUBSCRIPTION ID>";
            zid = "_defaultZone";
            zoid = "_defaultOwner";
        };
    };
}

我可以通过通知负载获取订阅 ID,我可以将订阅 ID 绑定到知道记录类型的本地缓存,但我想使用 CKFetchNotificationChangesOperation 来检索未读通知,此时我只有一个 CKQueryNotification 对象。

CKQueryNotification 对象只有一个 CKRecordID,据我所知,我无法从 CKRecordID 获取 CKRecord。我可以对容器中的所有 CKRecord->recordType 执行查询,但这似乎不正确。

感谢任何帮助!

如果您收到推送通知,那么您应该查看是否可以将其转换为 CKQueryNotification。实际上,您应该调用 -[CKDatabase fetchRecordWithID:completionHandler:] 来获取完整记录。然后您可以使用 .recordType 查看它是哪种记录。

只有当您对同一记录类型有多个订阅时才会遇到问题。您可以通过检查对象是否符合您用于该订阅的谓词来解决该问题。请参阅 predicate.evaluateWithObject 方法。如果您有 CKReference 的谓词,则不能使用它。

如果你想要这个的工作样本,那么你可以看看: https://github.com/evermeer/EVCloudKitDao 它还有一些其他不错的功能,例如自动解析 CKRecord 和在设备上缓存结果。