ユーザーが入力したテキストに従ってUITableViewをフィルタリングする検索フィールドを実装しています。
TableViewは、NSString(表示および検索するデータ)を保持する配列から構築され、 6000以上のアイテムを含む場合があります。ユーザーが検索を開始すると、メソッド
が実装されます。-(void)searchBar:(UISearchBar *)searchBar textDidChange:(NSString *)searchText
私のコードは機能しますが、データ配列が大きい場合、それは非常に遅く、非常に悪いユーザーエクスペリエンスを作成します(私のiPhone 4sは数秒間スタックします)。
私が(上記の方法で)検索を実装する方法は次のとおりです。
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];