私は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 ステートメントをより効率的なものに置き換えるにはどうすればよいですか?