1

我有一个包含 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 ...”但没有取得多大成功。我怀疑我需要改用线程,但我没有太多经验。

4

2 回答 2

1

Answer for: "How do can I make the searching process faster?"

It seams that you are using core data results in your table. So it's better let core data do the filtering for you.

So create a new fetchedResultController using a NSPredicate for filtering.

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

using MATCHES instead of = let you define a regular expression comparison (for a case insensitive compare)

于 2011-02-10T14:03:52.650 回答
0

我最终将搜索作为 NSOperation 进行,以免阻塞主线程。我也确实像 Reinhard 建议的那样使用了fetchedResultController.

苹果开发者网站上有一个关于 NSOperations 的非常好的视频。如果我记得的话,我被称为 Advanced iPhone part 1 之类的东西。

于 2011-03-10T20:30:13.800 回答