Использование NSPredicate для поиска массива с массивом
У меня есть массив объектов Card
(NSObjects), каждый из которых имеет поле с именем tags
, которое представляет собой NSArray из NSStrings.
Затем я хотел бы разделить термин пользовательского поиска на массив keywords
строк на componentsSeparatedByString
, а затем использовать NSPredicate для фильтрации моего массива карт, на основе которого элементы имеют теги, содержащие по крайней мере 1 ключевое слово в keywords
.
Я надеюсь, что это не слишком запутано! Я пробовал использовать предложение NSPredicate IN
безрезультатно. Как мне это сделать?
Ответы
Ответ 1
Учитывая, что array
содержит объект карты.
NSArray *keyWordsList = [keywords componentSeparatedByString:@","];
[array filteredArrayUsingPredicate:[NSPredicate predicateWithFormat:@"ANY %K IN %@",@"tags",keyWordsList]]
EDIT:
Для поиска частично вы можете использовать оператор LIKE.
[array filteredArrayUsingPredicate:[NSPredicate predicateWithFormat:@"ANY %K LIKE[cd] %@",@"tags",[partialkeyWord stringByAppendingString:@"*"]]]
Ответ 2
Не убивайте меня, если это не совсем правильно, но что-то вроде этого будет работать.
NSArray* arrayOfCards = [NSArray array];
NSArray* keywords = [NSArray array];
NSPredicate* containsAKeyword = [NSPredicate predicateWithBlock: ^BOOL(id evaluatedObject, NSDictionary *bindings) {
Card* card = (Card*)evaluatedObject;
NSArray* tagArray = card.tags;
for(NSString* tag in tagArray) {
if( [keywords containsObject: tag] )
return YES;
}
return NO;
}];
NSArray* result = [arrayOfCards filteredArrayUsingPredicate: containsAKeyword];