Создание NSPredicate для фильтра

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

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

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

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

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

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

Спасибо

6
задан ohhorob 15 April 2010 в 18:42
поделиться

2 ответа

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

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

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

Роб.

17
ответ дан 8 December 2019 в 12:58
поделиться

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

1
ответ дан 8 December 2019 в 12:58
поделиться