Я реализую поле поиска, которое фильтрует UITableView в соответствии с текстом, который вводит пользователь.
TableView построен из массива, содержащего NSStrings (данные для отображения и поиска), и может содержать 6000+ элементов. .
Когда пользователь начинает поиск, я реализую метод -(void)searchBar:(UISearchBar *)searchBar textDidChange:(NSString *)searchText
.
Однако мой код работает, когда массив данных большой, он очень медленный и создает очень плохой пользовательский интерфейс (мой iPhone 4 зависает на несколько секунд).
Я реализую поиск (методом, упомянутым выше):
NSMutableArray *discardedItems = [[NSMutableArray alloc] init]; // Items to be removed
searchResultsArray = [[NSMutableArray alloc] initWithArray:containerArray]; // The array that holds all the data
// Search for matching results
for (int i=0; i<[searchResultsArray count]; i++) {
NSString *data = [[containerArray objectAtIndex:i] lowercaseString];
NSRange r = [data rangeOfString:searchText];
if (r.location == NSNotFound) {
// Mark the items to be removed
[discardedItems addObject:[searchResultsArray objectAtIndex:i]];
}
}
// update the display array
[searchResultsArray removeObjectsInArray:discardedItems];
[myTableView reloadData];
Я не думал, что перебор массива с несколькими тысячами элементов вызовет какие-либо проблемы...
Любое предложение будет оценено!
ОБНОВЛЕНИЕ Я только что понял, что большую часть времени занимает следующее:
[searchResultsArray removeObjectsInArray:discardedItems];
autorelease
внутри цикла, хотя это добавило бы собственные затраты). Лучше использовать сравнение без учета регистра или иметь предварительно уменьшенную версию вашего текста. - person Hot Licks   schedule 02.09.2012