2

我需要一种将 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->recordType 执行查询,但这似乎不对。

任何帮助表示赞赏!

4

1 回答 1

6

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

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

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

于 2015-02-04T08:41:26.073 回答