Поиск основных данных, таких как приложение iPhone для контактов? - PullRequest
2 голосов
/ 23 января 2012

У меня есть Contact : NSManagedObject.Я хочу найти все контакты по name (полное имя).Поиск должен работать так же, как в приложении «Контакты iPhone».Таким образом, name соответствует searchString, если каждое слово в searchString начинается с любого слова в name.Поиск не учитывает регистр и диакритический знак.

Например, name "Matt Di Pasquale" соответствует searchString "Matt Pa", "Matt Mat" и "Pasq Di má", но не соответствует "att"или" squale ".

1 Ответ

1 голос
/ 23 января 2012

ОБНОВЛЕНИЕ: посмотрите видео-сессию 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]

...