只是想知道构建NSPredicate的最佳方法是,如果某些过滤器是可选的吗?
这基本上是针对过滤器的,所以如果没有选择某些选项,我不会按它们进行过滤
例如。如果我为过滤器设置了option1和option2。
NSPredicate * predicate = [NSPredicate predicateWithFormat:@“option1 =%@ AND option2 =%@] ....
否则如果只是选项1 NSPredicate * predicate = [NSPredicate predicateWithFormat:@“option1 =%@] ....
关键是有10种不同的过滤选项,所以我不想为10x10可能的组合编码。
由于
答案 0 :(得分:17)
John,看看构建并保留“子谓词”作为模板,然后使用逻辑分支构建复合谓词来执行过滤
/* Retain these predicate templates as properties or static variables */
NSPredicate *optionOneTemplate = [NSPredicate predicateWithFormat:@"option1 = $OPTVALUE"];
// .. and so on for other options
NSMutableArray *subPredicates = [NSMutableArray arrayWithCapacity:10];
/* add to subPredicates by substituting the current filter value in for the placeholder */
if (!!optionOneValue) {
[subPredicates addObject:[optionOneTemplate predicateWithSubstitutionVariables:[NSDictionary dictionaryWithObject:optionOneValue forKey:@"OPTVALUE"]]];
}
// .. and so on for other option values
/* use the compound predicate to combine them */
NSPredicate *filterPredicate = [NSCompoundPredicate andPredicateWithSubpredicates:subPredicates];
// Now use your filterPredicate
您可能希望使用字典来保持谓词模板的设置良好和有条理,但上面的示例显示了基本步骤。
罗布。
答案 1 :(得分:1)
predicateWithFormat:
采用NSString。因此,您所要做的就是根据所选的选项构建字符串(使用for循环附加到NSMutableString等)并将其传递给predicateWithFormat: