使用 NSPredicate 和数组进行 cloudKit 搜索
Posted
技术标签:
【中文标题】使用 NSPredicate 和数组进行 cloudKit 搜索【英文标题】:Using NSPredicate with array for cloudKit search 【发布时间】:2016-02-05 10:11:43 【问题描述】:当使用NSPredicate
时,我正在尝试搜索包含在数组中的所有对象(字符串)。下面的代码示例有效,但谓词仅收集第一个索引中的对象?? NSPredicate
用于CKQueryOperation
。
每个Record
都有一个名为Category
的键的值。
let array: [String] = ["Education", "Sport", "TV and Film"]
// select all records
//let predicate = NSPredicate(format: "Category = %@", category )
let predicate = NSPredicate (format: "Category == %@", argumentArray: array)
let query = CKQuery(recordType: "quizRecord", predicate: predicate)
// get just one value only
let operation = CKQueryOperation(query: query)
//code works but only queries Records with the Category for "Education"
【问题讨论】:
***.com/questions/18059170/… ? @Larme 那个问题/答案在 ObjectiveC 中——我尝试了很多变体,但我可以把它翻译成 Swift。 如何获得多个值? 【参考方案1】:尝试替换:
"Category == %@"
与:
"Category IN %@"
【讨论】:
谢谢,但您的回答出现以下错误:'CKException',原因:'无效谓词:Category IN "Education" (Error Domain=CKErrorDomain Code=12 "Invalid operator inlet predicate = NSPredicate (format: "Category == %@", argumentArray: array)
更改为 let predicate = NSPredicate (format: "Category == %@", argumentArray: [array])
。请注意,该数组应放在argumentArray 参数数组中。这应该与上述谓词中的IN
更改一起完成。
是的,就是这样!出色的工作。谢谢丹尼,非常感谢您的帮助
我遇到了同样的问题,只有搜索数组的第一个元素被匹配。我尝试了 Danny 的解决方案,但返回一个错误:“过滤器 EQUALS 不能与过滤器值类型 STRING_LIST 一起应用”。使用 Xcode 8.3.2 和 Swift 3。现在做什么?【参考方案2】:
我遇到了和 Peter Wiley 一样的问题。我找到的解决方案是 Danny Bravo 的解决方案的混搭,并对该解决方案发表评论。
let arrayPredicate = NSPredicate(format: "Name IN %@", argumentArray: [names])
为了获得多个结果,我需要在格式中同时使用关键字“IN”并用 [] 包装我的 argumentArray。
【讨论】:
以上是关于使用 NSPredicate 和数组进行 cloudKit 搜索的主要内容,如果未能解决你的问题,请参考以下文章
使用 NSPredicate 对 NSArray 进行排序,然后存储在一个新数组中