1

私はNSFetchedResultsControllerをフィルタリングし、フィルタリングされたデータを配列に入れるUISearchResultsControllerを持っています。現在、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];
  }
}

名、姓、またはグループ名に基づいてアカウントをフィルター処理しようとしています。これらの操作が遅いことはわかっていますが、高速化するにはどうすればよいですか?

編集:

繰り返しごとに述語を再作成していることに気付きましたが、それでももっと良い方法があるはずだと思います。Apple ビデオでバイナリ比較を行うことについて何かを見ましたが、検索文字列をバイナリ文字列に変換する方法がわかりません。「次に大きい」値を取得する方法もわかりません。

BEGINSWITH ステートメントをより効率的なものに置き換えるにはどうすればよいですか?

4

2 に答える 2

1

データ オブジェクトが CoreData オブジェクトであると想定していますが、そうであれば、検索対象のプロパティをインデックス付きとしてマークしましたか?

于 2011-06-29T03:52:39.530 に答える
1

それは古すぎる投稿ですが、他の誰かを助けることができます. このコードでは、NSPredicate のインスタンスを 1 つだけ作成します。

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];
于 2012-04-18T17:23:18.700 に答える