нужна помощь по простому предикату, чтобы сопоставить любое слово в строке со свойством - PullRequest
1 голос
/ 28 июня 2011

Допустим, я хочу позволить пользователю искать мои объекты, используя свойство name объектов.

У меня нет проблем, если пользователь вводит только одно слово: например: facial

Myпредикат будет:

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"name CONTAINS[cd] %@", word]; 

Но что если пользователь введет более одного слова, разделенных пробелом?Я хочу сделать что-то вроде:

NSArray *words = [query componentsSeparatedByString:@" "];
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"name CONTAINS[cd] ANY %@", words]; 

Но это не работает.Любое руководство?Спасибо!

Ответы [ 2 ]

1 голос
/ 28 июня 2011

Еще один способ сделать это (и я сам узнал об этом в результате вашего вопроса) - это использовать подзапросы.Проверьте это SO question для более подробной информации.Вы можете использовать подзапросы следующим образом -

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"SUBQUERY(%@, $str, SELF CONTAINS[cd] $str).@count != 0", words];

NSLog(@"%@", [array filteredArrayUsingPredicate:predicate]);

Кажется, это работает, поскольку я сам это проверял, но это также может быть таинственным и неясным способом, о котором упоминал Дейв, поскольку он не находит упоминания вРуководство по программированию предикатов.

Можно найти формат для SUBQUERY here.Это та же ссылка, что вы найдете в вопросе, связанном ранее.

0 голосов
/ 28 июня 2011

Как вы упомянули (правильно) в комментарии, вы можете сделать это путем создания предиката составного предиката, хотя вам нужно будет использовать orPredicateWithSubpredicates, а не вариант and.

Тодействительно лучший способ сделать это.Есть и другие, но они полагаются на более загадочное и неясное использование NSPredicate, и я действительно рекомендую пойти по пути build-a-соединение-предиката.

...