从iphone中的地址簿优化搜索结果

时间:2012-03-19 16:36:44

标签: iphone objective-c addressbook

当用户搜索时,我想针对地址簿数据搜索该查询,例如姓名,电话号码,网址,电子邮件地址。我的解决方案工作正常,但速度很慢。如果地址簿数据很大,应用程序就会卡住。如何优化搜索,以便我的应用程序即使在大型地址簿数据中也不会挂起?

这是我的代码

 - (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搜索吗?如果是的,怎么样?我如何更新我的表格视图?

1 个答案:

答案 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];
    });
});

您可能还想查看使用谓词而不仅仅是检查子字符串,可能会给您一些更清晰的逻辑。