使用UISearchbar搜索速度很慢并阻塞主线程

时间:2010-05-13 16:21:49

标签: iphone uisearchbar

我有一个包含超过3000个条目的表,搜索速度非常慢。

目前,我正在执行“TableSearch”示例代码(但没有范围)

- (BOOL)searchDisplayController:(UISearchDisplayController *)controller shouldReloadTableForSearchString:(NSString *)searchString
{
    [self filterContentForSearchText: searchString];

    // Return YES to cause the search result table view to be reloaded.
    return YES;
}

filterContentForSearchText方法如下:

- (void) filterContentForSearchText:(NSString*)searchText
{
// Update the filtered array based on the search text

// First clear the filtered array.
[filteredListContent removeAllObjects]; 

// Search the main list whose name matches searchText
// add items that match to the filtered array.
if (fetchedResultsController.fetchedObjects)
{
    for (id object in fetchedResultsController.fetchedObjects)
    {
        NSString* searchTarget = [tableTypeDelegate getStringForSearchFilteringFromObject:object];

        if ([searchTarget rangeOfString:searchText
                options:(NSCaseInsensitiveSearch|NSDiacriticInsensitiveSearch)].location != NSNotFound)
        {
                [filteredListContent addObject:object];
        }
    }
}
}

我的问题有两个:

  • 如何更快地完成搜索过程?
  • 如何阻止搜索阻止主线程?即阻止它阻止用户输入更多字符。

对于第二部分,我尝试了“performSelector:withObject:afterDelay:”和“cancelPreviousPerformRequests ...”但没有取得多大成功。我怀疑我需要使用线程,但我没有太多经验。

2 个答案:

答案 0 :(得分:1)

回答:“我怎样才能更快地完成搜索过程?”

您正在使用表中的核心数据结果。因此,最好让核心数据为您进行过滤。

因此,使用NSPredicate创建一个新的fetchedResultController进行过滤。

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"name = %@", searchText];
[fetchRequest setPredicate:predicate];

使用MATCHES而不是=让你定义一个正则表达式比较(用于不区分大小写的比较)

答案 1 :(得分:0)

我最终以NSOperation进行搜索,以免阻塞主线程。我也喜欢Reinhard建议并使用fetchedResultController

苹果开发者网站上有关于NSOperations的非常好的视频。如果我记得,我被称为高级iPhone第1部分。