似乎对于NSPredicate(format: "name CONTAINS %@", name)
:
如果name
不是空的,那么它工作正常
但是如果name
是空的,那么它不会获取所有内容。相反,它不获取任何东西。
目前我必须创建两个单独的nspreates来绕过这个行为,但是当有多个字符串值要过滤时,它会很快变得复杂。
例如:
if name.isNotEmpty {
predicate = NSPredicate(format: "name CONTAINS %@ AND summary = %@", name, summary)
} else {
predicate = NSPredicate(format: "summary = %@", summary)
}
然后使用该谓词获取请求。
我尝试过的另一个选项是简单地获取所有内容,然后使用string.contains()
函数过滤它。
但是,如果可能的话,我希望避免从读取请求中返回太多记录。
有更好的方法吗?
我也使用NSCompoundPredicate
作为@Joakim Danielson在评论中建议处理的行为:
你只需要隔离需要使用AND/OR的情况下,你使用多个逻辑:
var predicates: [NSPredicate] = []
predicate.append(defaultPredicate1)
predicate.append(defaultPredicate2)
...
if condition1 {
predicate.append(conditionPredicate1)
}
if condition2 {
predicate.append(conditionPredicate2)
}
...
let finalPredicate = NSCompoundPredicate(andPredicateWithSubpredicates: predicates)
简单的例子:
var predicates: [NSPredicate] = []
predicates.append(NSPredicate(format: "summary = %@", summary))
if name.isNotEmpty {
predicate.append(NSPredicate(format: "name CONTAINS %@)", name))
}
let finalPredicate = NSCompoundPredicate(andPredicateWithSubpredicates: predicates)