如何将CKQueryNotification连接到CKRecord或CKSubsription?

时间:2015-02-04 07:59:38

标签: ios cloudkit cknotification

我需要一种方法将CKQueryNotification连接到CKRecord或CKSubscription,这样我就可以在多种记录类型上接收更新/插入/删除。我成功收到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-&gt; recordType进行查询,但这似乎不对。

感谢任何帮助!

1 个答案:

答案 0 :(得分:6)

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

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

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