Почему мой UISearchController работает медленно? - PullRequest
1 голос
/ 29 июня 2011

У меня есть 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 чем-то более эффективным?

Ответы [ 2 ]

1 голос
/ 18 апреля 2012

Это слишком старый пост, но может помочь кому-то еще. С помощью этого кода вы создадите только один экземпляр NSPredicate.

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];
}
self.filteredArray = [unfilteredResults filteredArrayUsingPredicate:predicate];
0 голосов
/ 29 июня 2011

Я предполагаю, что ваши объекты данных являются объектами CoreData. Если да, пометили ли вы свойства, по которым вы ведете поиск, как проиндексированные?

...