为啥我的 UISearchController 很慢?

Posted

技术标签:

【中文标题】为啥我的 UISearchController 很慢?【英文标题】:Why is my UISearchController slow?为什么我的 UISearchController 很慢? 【发布时间】:2011-06-29 03:27:01 【问题描述】:

我有一个 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 语句替换为更有效的语句?

【问题讨论】:

【参考方案1】:

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

【讨论】:

我相信是的。但是,如何将关系标记为已索引?这甚至可能吗? 对于我获取的属性,我添加了一个属性并将其编入索引。 是的。我只搜索几百条记录。澄清一下,我对我的数据进行了非规范化,这样我就不需要每次想使用谓词时都进行获取。【参考方案2】:

这是太旧的帖子,但可以帮助其他人。使用此代码,您将只创建一个 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];

【讨论】:

以上是关于为啥我的 UISearchController 很慢?的主要内容,如果未能解决你的问题,请参考以下文章

为啥我的 UISearchController 委托方法没有被调用?

为啥我的 UITableView 滚动偏移在返回其视图时最终落在 UISearchController 后面?

为啥 iOS viewPager 与 UISearchController 崩溃?

为啥在 UISearchBar 上输入时 UISearchController 会消失?

UISearchController:searchResultsController 不显示

为啥我的 UIView 不显示 UISearchBar