代码之家  ›  专栏  ›  技术社区  ›  Robert MouzmiSadiq

使用uisearchbar搜索很慢,并且阻塞了主线程

  •  1
  • Robert MouzmiSadiq  · 技术社区  · 14 年前

    我有一张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 回复  |  直到 13 年前
        1
  •  1
  •   Reinhard    14 年前

    回答:“我如何使搜索过程更快?”

    您正在使用表中的核心数据结果。所以最好让核心数据为您过滤。

    因此,使用nspredicate进行筛选,创建一个新的fetchedResultController。

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

    使用matches而不是=可以定义正则表达式比较(对于不区分大小写的比较)

        2
  •  0
  •   Robert MouzmiSadiq    13 年前

    我最后做了搜索作为一个nsoperation,以免阻塞主线程。我也很喜欢莱因哈德的建议和使用 fetchedResultController .

    在苹果开发者网站上有一个非常好的操作视频。如果我记得的话,我被称为“高级iPhone第一部分”。