2010-05-13 41 views
1

我有一个表超过3000个条目和搜索是非常缓慢的。使用UISearchbar搜索很慢,并阻止主线程

在我做就像在“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 ...”,但没有取得太大的成功。我怀疑我需要使用线程,但我没有太多的经验。

回答

0

我最后做的搜索作为的NSOperation,以免阻塞主线程。我也像Reinhard建议的那样使用了fetchedResultController

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

1

回答:“我怎么能使搜索过程更快?”

它在您的表格中使用核心数据结果。所以最好让核心数据为你做滤波。

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

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

用火柴代替=让你定义一个正则表达式的比较(不区分大小写用于比较的情况下)

+0

是的,这是一个很好的建议。 – Robert 2011-03-10 20:26:44