Я пытаюсь создать подписку на уведомления CloudKit, но не могу правильно указать предикат. Появляются простые уведомления только с одним предикатом сравнения, поэтому полезная нагрузка настроена правильно, но если я сделаю предикат немного более сложным, он не получит никаких уведомлений. Мне нужно подписаться на несколько изменений записей, но я должен делать это по одному. Я хочу иметь только одну подписку, используя IN или OR, но, похоже, это не работает.
рабочий предикат
let predicate = NSPredicate(format: "recordID == %@", recordID1)
нерабочие предикаты
let recordIDs = [recordID1, recordID2, recordID3, recordID4]
let predicate1 = NSPredicate(format: "recordID IN %@", recordIDs)
let predicate2 = NSPredicate(format: "NOT recordID IN %@", recordIDs)
var predicate3 = NSPredicate(format: "recordID != %@", recordID1)
for id in recordIDs.filter {$0 != recordID1} {
predicate3 = NSCompoundPredicate(andPredicateWith: [predicate, NSPredicate(format: "recordID != %@", id)])
}
Я использую для справки руководство по CKQuery CloudKit (https://developer.apple.com/reference/cloudkit/ckquery). Отличается ли реализация предикатов подписки или я просто создаю неправильные предикаты? Кстати, все предикаты компилируются, на точках останова отображаются корректно, ошибок в коде нет, приложение нигде не падает, я проверил, что подписки действительно на сервере и с предикатами я уточнил. Не имеет значения, изменена ли запись на устройстве или на сервере, более сложные предикаты никогда не совпадают.
Для завершения вот остальная часть кода подписки, которая отлично работает с первым предикатом, но не с остальными:
let subscription = CKSubscription(recordType: "Avatar", predicate: predicate, options: CKSubscriptionOptions.FiresOnRecordUpdate)
let notificationInfo = CKNotificationInfo()
notificationInfo.shouldSendContentAvailable = true
subscription.notificationInfo = notificationInfo
Любая помощь приветствуется.
CKQuery
), предикаты CloudKit не поддерживаютOR
. - person rmaddy   schedule 25.10.2016