当用户搜索时,我想针对地址簿数据搜索该查询,例如姓名,电话号码,网址,电子邮件地址。我的解决方案工作正常,但速度很慢。如果地址簿数据很大,应用程序就会卡住。如何优化搜索,以便我的应用程序即使在大型地址簿数据中也不会挂起?
这是我的代码
- (void)searchBar:(UISearchBar *)searchBar textDidChange:(NSString *)searchText{
[self takeSomeActionWhenTextChange];
}
-(void)takeSomeActionWhenTextChange{
[contactArray removeAllObjects];
NSString *searchText=[[textSearchBar text] lowercaseString];
for (int index=0; index<count; index++) {
ABRecordRef record=CFArrayGetValueAtIndex(people, index);
//[self checkStringISAddress:searchText withRecord:record];
if ([self checkStringIsFirstName:searchText withRecord:record]==YES
|| [self checkStringIsLastName:searchText withRecord:record] == YES
||[self checkStringIsNote:searchText withRecord:record]==YES
|| [self checkStringIsAddress:searchText withRecord:record]==YES
|| [self checkStringIsCompany:searchText withRecord:record]==YES
||[self checkStringIsEmail:searchText withRecord:record]
||[self checkStringIsPhonenumber:searchText withRecord:record]==YES )
{
NSLog(@"object added inside Array");
[contactArray addObject:record];
[contactTableView reloadData];
}else{
NSLog(@"No Match For this object");
[contactTableView reloadData];
}
}
}
我将检查来自搜索查询的子字符串是否与名字,姓氏,电子邮件和&amp;等等。上面的方法包含检查子串是否存在的逻辑?如果ti匹配,我会将它添加到数组中,否则不会。
我应该使用线程或GCD进行PERFOEM搜索吗?如果是的,怎么样?我如何更新我的表格视图?
答案 0 :(得分:1)
您可以使用GCD,但您仍应显示活动指示器,以向用户显示正在发生的事情。它只会阻止主线程阻塞,并且UI锁定。
未经测试,您当然可以使用不同的常量设置队列的优先级:
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
//Perform the search
//perform your search here...
dispatch_async(dispatch_get_main_queue(), ^{
//Update the UI
[self.tableView reloadData];
});
});
您可能还想查看使用谓词而不仅仅是检查子字符串,可能会给您一些更清晰的逻辑。