CoreDataに1万件くらいの大量のデータがある場合、UISearchBarなどで部分一致で一文字目から検索したりすると、極端に遅くなってしまうことがあります。
そういった場合はちょっとしたハックで動きを軽くしましょう。
名前と住所の入ったデータだとして、これが1万件ぐらい既に入っているものとします。
これを以下のように変更します。
firstLetterには、Personエンティティの検索対象のattributeの、頭文字を入れます。アルファベットや50音などが良いと思います。
あとはNSPredicateを作成する際に場合分けをすれば良いです。
UISearchBarControllerを実装している場合だと、以下の様なメソッドを書けば良いと思います。
- (void)filterContentForSearchText:(NSString*)searchText
scope:(NSString*)scope
{
NSString *query = self.searchDisplayController.searchBar.text;
NSPredicate *namePred; // 名前用のPredicate
if([query length] == 0) {
return;
}else if ([query length] == 1) { // 検索窓に一文字しか入力されなかったときは、firstLetterから探す
namePred = [NSPredicate predicateWithFormat:@"firstLetter.firstLetter contains[cd] %@", query];
}else{ // 二文字以上の場合は部分検索
namePred = [NSPredicate predicateWithFormat:@"name contains[cd] %@", query];
}
if (query && query.length) {
[self.fetchedResultsController.fetchRequest setPredicate:namePred];
[NSFetchedResultsController deleteCacheWithName:@"Person"];
NSError *error = nil;
if (![self.fetchedResultsController performFetch:&error]) {
// Handle error
NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
exit(-1); // Fail
}
}
}