iPhone のすべての連絡先を表示し、ABPeoplePickerNavigationController のように動作するカスタマイズされた UITableViewController を構築しています。つまり、連絡先の検索もサポートしています。私はここのコードでこれをやっています。
を使用して検索機能を実装し、appcoda によるSearch Bar and Search Display Controller
このチュートリアルに従いました。
私の NSArray はABRecordRef
私のメソッドの配列であるため、filterContentForSearchText: scope:
これは次のとおりです。
- (void)filterContentForSearchText:(NSString*)searchText scope:(NSString*)scope
{
NSPredicate *resultPredicate = [NSPredicate predicateWithBlock:^BOOL(id evaluatedObject, NSDictionary *bindings) {
ABRecordRef person = (__bridge ABRecordRef)evaluatedObject;
NSString * fullname = [self getFullnameOfRecord:person];
NSPredicate *tmpPredicate = [NSPredicate predicateWithFormat:@"self contains[c] %@", searchText];
if ([tmpPredicate evaluateWithObject:fullname]) {
return YES;
} else {
NSLog(@"tmpPredicate didn't match");
return NO;
}
}];
searchResults = [self.allContacts filteredArrayUsingPredicate:resultPredicate];
}
検索結果は問題ありませんが、これは非常に大きな配列であるため、動作が非常に遅くなります。この検索メカニズムのパフォーマンスを向上させる方法はありますか?
更新: @Eiko が示唆したように、内側の NSPredicate を次のコードに置き換えてみました。
NSRange range = [fullname rangeOfString:searchText options:NSCaseInsensitiveSearch];
if (range.length > 0) {
return YES;
} else {
return NO;
}
しかし、それはパフォーマンスを改善しませんでした。