为什么我的UISearchController变慢了?

时间:2011-06-29 03:27:02

标签: iphone ios core-data nspredicate uisearchresultscontroller

我有一个UISearchResultsController,它过滤我的NSFetchedResultsController并将过滤后的数据放入一个数组中。目前,我使用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语句?

2 个答案:

答案 0 :(得分:1)

这个帖太旧了,但可以帮助别人。使用此代码,您将只创建一个NSPredicate实例。

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];
}
self.filteredArray = [unfilteredResults filteredArrayUsingPredicate:predicate];

答案 1 :(得分:0)

我假设您的数据对象是CoreData对象,如果是这样,您是否将要搜索的属性标记为索引?