NSPredicate
не использует любой алгоритм поиска - все, что NSPredicate
делает, представляет ваш запрос.
Это работа любого, кто принимает NSPredicate
в качестве опции для выбора алгоритма поиска. В вашем случае, это, вероятно, метод NSArray
filteredArrayUsingPredicate:
?
Если вы хотите искать данные быстрее, вам придется написать лучший алгоритм самостоятельно, держу пари, что массив просто проходит через каждый элемент и сопоставляет его с предикатом. Не эффективно, но работает на что угодно :)
Попробуйте взглянуть на sqlite (или CoreData), они лучше индексируются, чем обычные массивы.
Или вы можете составить индекс самостоятельно - поместите каждый контакт в словарь, ключом которого является первая буква контакта, - это должно уменьшить количество записей, которые вам нужно искать!
т.е. вместо массива
[ @"Alex", @"Bob", @"Bill", @"Carl" ... ]
Есть словарь
{
@"A" : [ @"Alex" ],
@"B" : [ @"Bob", @"Bill" ],
@"C" : [ @"Carl" ]
...
}
Для строки поиска @"Bi"
вам нужно только найти элементы в массиве для @"B"
.
PS Не забудьте сделать свой словарь регистром / диакритически независимым;)