Просто удивление, что лучший способ создать NSPredicate состоит в том, если некоторые фильтры являются дополнительными?
Это в основном для фильтра, поэтому если некоторые опции не выбраны, я не делаю для фильтрации ими
например, Если у меня есть option1 и набор option2 для фильтра.
NSPredicate* предикат = [NSPredicate predicateWithFormat:@ "option1 = % И option2 = %]....
иначе, если просто option1 NSPredicate* предикат = [NSPredicate predicateWithFormat:@ "option1 = %]....
Так как ключ существует 10 различных вариантов для фильтрации, таким образом, я не хочу должным быть кодировать для 10x10 возможные комбинации.
Спасибо
] Джон, взгляните на создание и сохранение «субпредикатов» в качестве шаблонов, а затем используйте свои логические ветви для создания составного предиката для выполнения фильтрации
/* 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
Вы можете использовать словарь для хранения набора шаблонов предикатов красиво и организованно, но в приведенном выше примере показаны основные шаги.
Роб.
predicateWithFormat:
принимает NSString. Итак, все, что вам нужно сделать, это создать строку на основе выбранных параметров (используя цикл for для добавления к NSMutableString и т. Д.) И передать ее predicateWithFormat: