【发布时间】:2014-10-11 10:39:09
【问题描述】:
我正在构建一个定制的 UITableViewController,它显示 iPhone 中的所有联系人,其行为类似于 ABPeoplePickerNavigationController。这意味着它还支持搜索联系人。我正在使用代码 here 进行此操作。
我已经使用Search Bar and Search Display Controller 实现了搜索功能,并且我遵循了这个tutorial by appcoda。
由于我的 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;
}
但它并没有提高性能。
【问题讨论】:
标签: ios performance nspredicate uisearchbardisplaycontrol