2012-07-02 2 views
20

У меня есть массив объектов Card (NSObjects), каждый из которых имеет поле tags, которое представляет собой NSArray из NSStrings.Использование NSPredicate для поиска массива с массивом

Я тогда хотел бы разделить слово для поиска пользователя в массив называется keywords строк по componentsSeparatedByString, а затем использовать NSPredicate фильтровать мой массив карт, на основании которых элементы имеют метки, содержащие по меньшей мере, 1 ключевое слово в keywords.

Надеюсь, это не слишком запутанно! Я пробовал использовать предложение NSPredicate IN безрезультатно. Как мне это сделать?

ответ

57

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:@"*"]]] 
+0

О, мужчина, это еще проще .. Я пробовал оба ответа, и оба они одинаково хорошо функционируют! – quantum

+0

как я могу реализовать частичный поиск в этом? Так что, если пользователь набирает «Bask», появляется «Card» с тегом «Баскетбол»? – quantum

+0

@quantum. Спасибо. Пожалуйста, проверьте Edit. – Vignesh

8

Не убивайте меня, если это не совсем правильно, но что-то в этом роде будет работать.

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]; 
+0

Это прекрасно работало. Спасибо большое! – quantum

+1

Я влюбился в ответ от @Vignesh –

+0

Я тоже знаю меня, извините, я просто должен принять это вместо этого! :( – quantum

Смежные вопросы