在 CloudKit 谓词中使用包含比较数组的 CONTAINS 或 ANY

Posted

技术标签:

【中文标题】在 CloudKit 谓词中使用包含比较数组的 CONTAINS 或 ANY【英文标题】:Use CONTAINS or ANY in CloudKit predicate with an array of comparison 【发布时间】:2017-09-13 10:14:56 【问题描述】:

我尝试将NSCompoundPredicate(orPredicateWithSubpredicates:)CloudKit NSPredicate 一起使用,但后来我在Apple 的文档中读到CloudKit 不支持OR 比较谓词,所以我遇到了障碍。

我有一个 CKReferences 数组,我需要查看 Reference listRecord-type 是否包含这些引用。

我正在为如何组装谓词本身而苦苦挣扎,因为我试图避免 completionBlock 中的嵌套查询。

假设我有以下引用数组:

let refs = [CKReference]() // in my case the array isn't empty

我尝试了以下方法,但没有成功,因为它只查找数组的第一个对象,而不是整个数组。

let predicate = NSPredicate(format: "tableName CONTAINS %@", argumentArray: refs)

如果我打印predicate,它会打印:

tableName CONTAINS CKReference: 0x600000229c40; 20B54862-46CC-405F-BAE8-0DC8D3A52F78:(_defaultZone:defaultOwner)>

如您所见,它只查找数组中的第一个对象。

如果我在谓词中使用ANY 运算符,它可能会起作用,例如:

let predicate = NSPredicate(format: "ANY  '%@', '%@'  = tableName", args: refs[0], refs[1])

但我的问题是如何构建该谓词,因为 refs 数组是动态的,我不知道它可能包含多少对象,因此我不知道如何构建 @987654336 @访问refs数组的[0], [1], ...

您对此有任何解决方法吗?还是解决此问题的最佳方法?

谢谢。

编辑

我想出了解决这个问题的方法,但我不知道这是否是最有效的方法,所以我仍然愿意接受答案和意见。

这是我的临时解决方案:

for (i, reference) in  refs.enumerated() 
    let predicate = NSPredicate(format: "tableName CONTAINS %@", reference)
    // CKQuery
    // CKQueryOperation
    // Database.add(CKQueryOperation)
    if i == refs.count - 1 
        // UPDATE UI
    

【问题讨论】:

"tableName IN %@", refs? @Larme 由于引用是 REFERENCE_LIST 类型,因此无法使用过滤器类型 IN 进行查询。 要清楚,您的tableName 代表一个CKReference 列表,您想使用另一个CKReference 列表创建一个谓词,以查看两个数组是否存在非空交集。对吗? @rmaddy 完全正确 【参考方案1】:
NSMutableArray * tagsReferencesArray = [[NSMutableArray alloc] init];

    [tagsReferencesArray addObject:tag100_Reference];
    [tagsReferencesArray addObject:tag300_Reference];
    [tagsReferencesArray addObject:tag200_Reference];

predicate= [NSPredicate predicateWithFormat:@"ANY %@ in field_TagsReferenceList ", tagsReferencesArray];

【讨论】:

以上是关于在 CloudKit 谓词中使用包含比较数组的 CONTAINS 或 ANY的主要内容,如果未能解决你的问题,请参考以下文章

使用 NSPredicate 和数组进行 cloudKit 搜索

在 Cloudkit 谓词上使用 OR 运算符

CloudKit 谓词

Swift / Cloudkit 谓词格式

CloudKit 谓词:使用 CKQuery 的谓词搜索多个参考字段

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