具有复杂谓词的 CKSubscription

Posted

技术标签:

【中文标题】具有复杂谓词的 CKSubscription【英文标题】:CKSubscription with complex predicate 【发布时间】:2014-08-22 08:54:08 【问题描述】:

我正在尝试以这种方式使用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 中。是真正的 Apple 漏洞还是我的?

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

附言我在OSX 10.10 DP6 上使用Xcode 6 beta 6,在iPhone 5S 上使用ios8 beta 5

更新:

具有以下谓词之一的订阅可以正常工作:

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 - 这里有两个雷达接收 CloudKit 推送通知有问题:

http://openradar.appspot.com/18807663

http://openradar.appspot.com/18798061

我找到了通过使用大量相等比较器呈现IN 条件来正确保存CKSubscription 的解决方法。但实际上我没有收到来自 CLoudKit 的推送通知...

【问题讨论】:

所有这些字段:valueprev_valueevent_type 都是 Int64 这些是 myValue & events 中的实际失败值吗? @BenLachman 实际 myValue 为 1022,事件为 @[@1,@2,@3]。 我在创建复合谓词时也遇到了问题,似乎CloudKit存储它不一致,你可以尝试获取订阅并打印出所有子谓词来查看,这是你最初保存的,我的问题: openradar.io/18549283顺便说一句,从那以后你有什么进展吗? 可以请教的专家太少了,尤其是CKSubscription 有点像一辆越野车,很难继续前进 【参考方案1】:

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

【讨论】:

以上是关于具有复杂谓词的 CKSubscription的主要内容,如果未能解决你的问题,请参考以下文章

具有一对多关系的复杂核心数据谓词

获取复杂请求核心数据的谓词和表达式

CKReference 的 CloudKit 订阅通知未按预期工作

Entity Framework LINQ 复杂查询 - 组合多个谓词

Xcode:使用复杂谓词过滤核心数据集

复杂的 NSPredicates:比较最近对象的值