具有复杂谓词的CKSubscription

时间:2014-08-22 08:54:09

标签: ios cloudkit 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无法作为CKSubscription对象的一部分正确存储在CloudKit中。它真的是苹果虫还是我的?

P.S。我通过删除谓词条件的不同部分尝试了很多不同的组合。看起来event_type的唯一条件正常,但当我将3个条件与AND混合时 - 这会导致问题。

P.P.S。我在{5}上使用Xcode 6 beta 6,在iPhone 5S上使用OSX 10.10 DP6

更新

使用以下谓词之一进行订阅可以正常工作:

iOS8 beta 5

但是使用公共谓词保存订阅失败:

NSPredicate *predicate1 = [NSPredicate predicateWithFormat:
    @"(value > %@) AND (prev_value < %@)", @(myValue), @(myValue)];

NSPredicate *predicate2 = [NSPredicate predicateWithFormat:
    @"(event_type IN %@)", events];

看起来像真正的Apple CloudKit错误。刚刚在bugreport.apple.com上打开了问题#18105879

更新2:

感谢@purrrminator - 这里有两个接收CloudKit推送通知有问题的雷达:

http://openradar.appspot.com/18807663

http://openradar.appspot.com/18798061

我找到了通过使用大量相等比较器呈现NSPredicate *predicate = [NSPredicate predicateWithFormat: @"(value > %@) AND (prev_value < %@) AND (event_type IN %@)", @(myValue), @(myValue), events]; 条件来正确保存CKSubscription的解决方法。但实际上我没有收到来自CLoudKit的推送通知......

1 个答案:

答案 0 :(得分:0)

尝试创建CKNotification对象,在将订阅添加到数据库之前将其添加到订阅中。还要确保检查与远程通知相关的所有委托方法,包括didFailToRegisterForRemoteNotificationsWithError。关于谓词问题,我建议您尝试NSCompoundPredicate并对其他选项进行更深入的Predicates Programming Guide审核。