Как подключить CKQueryNotification к CKRecord или CKSubsription?
Мне нужен способ подключить 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";
};
};
}
Я могу получить идентификатор подписки по полезной нагрузке уведомления и привязать идентификатор подписки к локальному кешу, который знает тип записи, но я хочу использовать CKFetchNotificationChangesOperation для извлечения непрочитанных уведомлений, и в этот момент у меня есть только объект CKQueryNotification,
Объект CKQueryNotification имеет только CKRecordID, и, насколько я могу судить, я не могу получить CKRecord из CKRecordID. Я мог бы выполнить запрос на все мои CKRecord->recordType в моем контейнере, но это не так.
Любая помощь приветствуется!
1 ответ
Если вы получили push-уведомление, то вы должны увидеть, можете ли вы привести его к CKQueryNotification. В самом деле, вы должны вызвать -[CKDatabase fetchRecordWithID: завершение Handler:] для получения полной записи. затем вы можете использовать.recordType, чтобы увидеть, что это за запись.
Проблема возникает только тогда, когда у вас несколько подписок на один и тот же recordType. Вы можете решить это, проверив, соответствует ли объект предикату, который вы использовали для этой подписки. См. Метод предиката.evaluateWithObject для этого. Вы не можете использовать это, если у вас есть предикат для CKReference.
Если вам нужен рабочий пример этого, то вы можете взглянуть на: https://github.com/evermeer/EVCloudKitDao который имеет некоторые другие полезные функции, такие как автоматический синтаксический анализ от и до CKRecord и кэширование на устройстве результатов.