У меня есть UISearchResultsController, который фильтрует мой NSFetchedResultsController и помещает отфильтрованные данные в массив. В настоящее время я использую NSPredicate, чтобы взять содержимое панели поиска и применить фильтр. Вот мой предикат:
[filteredArray removeAllObjets];
for(Account *account in unfilteredResults){
NSPredicate *predicate;
if(controller.searchBar.selectedScopeButtonIndex == 0){
predicate = [NSPredicate predicateWithFormat:@"accountFirstName BEGINSWITH[cd] %@", searchString];
}else if(controller.searchBar.selectedScopeButtonIndex == 1){
predicate = [NSPredicate predicateWithFormat:@"accountLastName BEGINSWITH[cd] %@", searchString];
}else if(controller.searchBar.selectedScopeButtonIndex == 2){
predicate = [NSPredicate predicateWithFormat:@"group.groupName CONTAINS[cd] %@", searchString];
}
if([predicate evaluateWithObject:account]){
[self.filteredArray addObject:account];
}
}
Я пытаюсь отфильтровать учетные записи по имени, фамилии или имени группы. Я знаю, что эти операции медленные, но что можно сделать, чтобы сделать их быстрее?
Edit:
Я только что заметил, что я воссоздаю предикат на каждой итерации, но я все еще думаю, что должен быть лучший способ. Я видел кое-что о выполнении двоичного сравнения в видео Apple, но я понятия не имею, как преобразовать строку поиска в двоичную строку и как получить «следующее наибольшее» значение.
Как заменить оператор BEGINSWITH чем-то более эффективным?