在CloudKit谓词中使用带有比较数组的CONTAINS或ANY

时间:2017-09-13 10:14:57

标签: ios nspredicate cloudkit ckquery

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

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

我正在努力学习如何组装谓词本身,因为我试图避免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 )GT;

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

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

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

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

你有解决方法吗?或者是解决此问题的最佳方法?

谢谢。

修改

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

这是我的临时解决方案:

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
    }
}

1 个答案:

答案 0 :(得分: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];