在 CloudKit 谓词中使用 CONTAINS 或 ANY 与比较数组
Use CONTAINS or ANY in CloudKit predicate with an array of comparison
我尝试将 NSCompoundPredicate(orPredicateWithSubpredicates:)
与 CloudKit
NSPredicate
一起使用,但后来我在 Apple 的文档中读到 OR
比较谓词在 CloudKit
中不受支持所以我遇到了障碍。
我有一个 CKReferences
的数组,我需要查看 Reference list
的 Record-type
是否包含这些引用。
我正在努力研究如何 assemble 谓词本身,因为我试图避免 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
数组是动态的,我不知道它可能包含多少对象,因此我不知道如何构建构建 predicate args
访问 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
}
}
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];
我尝试将 NSCompoundPredicate(orPredicateWithSubpredicates:)
与 CloudKit
NSPredicate
一起使用,但后来我在 Apple 的文档中读到 OR
比较谓词在 CloudKit
中不受支持所以我遇到了障碍。
我有一个 CKReferences
的数组,我需要查看 Reference list
的 Record-type
是否包含这些引用。
我正在努力研究如何 assemble 谓词本身,因为我试图避免 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
数组是动态的,我不知道它可能包含多少对象,因此我不知道如何构建构建 predicate args
访问 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
}
}
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];