Построение NSP-предиката для фильтра - PullRequest
6 голосов
/ 15 апреля 2010

Просто интересно, как лучше построить NSPredicate, если некоторые фильтры не являются обязательными?

Это в основном фильтр, поэтому, если не выбраны некоторые параметры, я не буду фильтровать по ним

например. Если у меня есть option1 и option2 для фильтра.

NSPredicate * предикат = [NSPredicate предикатWithFormat: @ "option1 =% @ AND option2 =% @] ....

иначе, если просто option1 NSPredicate * предикат = [NSPredicate предикатWithFormat: @ "option1 =% @] ....

Ключ в том, что есть 10 различных вариантов фильтрации, поэтому я не хочу кодировать для возможных комбинаций 10x10.

Спасибо

Ответы [ 2 ]

17 голосов
/ 15 апреля 2010

Джон, посмотрите на создание и сохранение «предикатов» в качестве шаблонов, а затем используйте свои логические ветви для построения составного предиката для выполнения фильтрации

/* 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

Возможно, вы захотите использовать словарь, чтобы сохранить набор шаблонов предикатов красивым и организованным, но в приведенном выше примере показаны основные шаги.

Rob.

1 голос
/ 15 апреля 2010

predicateWithFormat: принимает строку NSString. Поэтому все, что вам нужно сделать, это построить строку на основе выбранных параметров (используя цикл for для добавления к NSMutableString и т. Д.) И передать ее в predicateWithFormat:

...