LoginSignup
19
19

More than 5 years have passed since last update.

CoreDataでUISearchBarからの検索を速くする

Last updated at Posted at 2013-09-06

CoreDataに1万件くらいの大量のデータがある場合、UISearchBarなどで部分一致で一文字目から検索したりすると、極端に遅くなってしまうことがあります。
そういった場合はちょっとしたハックで動きを軽くしましょう。

名前と住所の入ったデータだとして、これが1万件ぐらい既に入っているものとします。
スクリーンショット 2013-09-06 17.08.51.png

これを以下のように変更します。
スクリーンショット 2013-09-06 17.10.36.png
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
        }
    }
}
19
19
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
19
19