CKSubscription со сложным предикатом
Я пытаюсь использовать CKSubscription
сюда:
NSArray *events = @[@1,@2,@3];
NSInteger myValue = 100;
NSPredicate *predicate = [NSPredicate predicateWithFormat:
@"(value > %@) AND (prev_value < %@) AND (event_type IN %@)",
@(myValue), @(myValue), events];
CKSubscription *sub = [[CKSubscription alloc] initWithRecordType:@"TableName"
predicate:predicate options:(CKSubscriptionOptionsFiresOnRecordCreation)];
[db saveSubscription:sub completionHandler:^(CKSubscription *s, NSError *error) {
if (error) {
NSLog(@"Error: %@", error.localizedDescription);
return;
}
NSLog(@"Success!");
}];
Это вызывает у меня ошибку:
Error: Error saving record subscription with id 781FB482-C9C9-4DA5-8022-CFDB8006223A to server:
invalid attempt to set value type NUMBER_INT64 for field 'binding_0' for type
'_sub_trigger_sub_220b17724b5262b0590a3c9d66be9826', defined to be: INT64_LIST
Это выглядит как действительный NSPredicate
не может быть должным образом сохранен в CloudKit как часть CKSubscription
объект. Это та самая настоящая ошибка Apple или моя?
PS Я перепробовал много разных комбинаций, удалив разные части условия предиката. Похоже, единственное условие для event_type
работает нормально, но когда я смешиваю 3 условия с AND
- это вызывает проблему.
PPS я использую Xcode 6 beta 6
на OSX 10.10 DP6
а также iOS8 beta 5
на iPhone 5S
ОБНОВИТЬ:
Подписки с одним из следующих предикатов работают нормально:
NSPredicate *predicate1 = [NSPredicate predicateWithFormat:
@"(value > %@) AND (prev_value < %@)", @(myValue), @(myValue)];
NSPredicate *predicate2 = [NSPredicate predicateWithFormat:
@"(event_type IN %@)", events];
Но сохранить подписку с общим предикатом не удается:
NSPredicate *predicate = [NSPredicate predicateWithFormat:
@"(value > %@) AND (prev_value < %@) AND (event_type IN %@)",
@(myValue), @(myValue), events];
Похоже, настоящая ошибка Apple CloudKit. Только что открыт вопрос на bugreport.apple.com #18105879
ОБНОВЛЕНИЕ 2:
Благодаря @purrrminator - вот два радара с проблемой получения push-уведомлений CloudKit:
http://openradar.appspot.com/18807663
http://openradar.appspot.com/18798061
Я нашел обходной путь для сохранения CKSubscription
правильно через представление IN
условие с множеством сравнений равенства. Но на самом деле я не получил push-уведомлений от CLoudKit...
1 ответ
Попробуйте создать объект CKNotification, добавьте его в подписку, прежде чем добавить подписку в базу данных. Также убедитесь, что вы проверяете все методы делегата, относящиеся к удаленному уведомлению, включая didFailToRegisterForRemoteNotificationsWithError. Что касается проблемы предикатов, я бы порекомендовал попробовать NSCompoundPredicate и более детальный обзор Руководства по программированию предикатов для других вариантов.