ОБНОВЛЕНИЕ: посмотрите видео-сессию WWDC 2010: Оптимизация производительности основных данных на iPhone OS , чтобы узнать, как это сделать гораздо быстрее.
На основе еще один ответ о NSPredicate , создайте NSCompoundPredicate
из подпредикатов, используя регулярное выражение ICU :
NSArray *searchWords = [searchString words]; // see link below (1)
NSMutableArray *subpredicates = [NSMutableArray arrayWithCapacity:[searchWords count]];
for (NSString *searchWord in searchWords) {
[subpredicates addObject:[NSPredicate predicateWithFormat:
@"name CONTAINS[cd] %@ AND" // maybe speeds it up
" name MATCHES[cd] %@",
searchWord, [NSString stringWithFormat:
@".*\\b%@.*", searchWord]]];
}
fetchRequest.predicate = [NSCompoundPredicate andPredicateWithSubpredicates:subpredicates];
Я думаю, MATCHES
фильтрация происходит после того, как объекты были извлечены в память, поэтому name CONTAINS[cd] %@
должен ограничить количество извлекаемых объектов и, возможно, ускорить процесс.
(1) Какао-завод реализует -[NSString words]