iPhone多线程搜索

时间:2010-06-17 22:19:13

标签: iphone cocoa-touch multithreading search uisearchdisplaycontroller

我对任何类型的多线程都不熟悉,似乎无法在后台线程上正确地使用简单的搜索方法。似乎所有东西都与NSAutoreleasePool一致,并且UI在主线程上更新。该应用程序不会崩溃,并在后台执行搜索,但搜索结果会多次生成几个相同的项目,具体取决于我输入的速度。搜索工作正常,没有多线程(已注释掉),但由于我正在处理大量数据,因此速度很慢。这是代码:

    - (void)filterContentForSearchText:(NSString*)searchText { 
isSearching = YES;
 NSAutoreleasePool *apool = [[NSAutoreleasePool alloc] init];

 /*
  Update the filtered array based on the search text and scope.
  */

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


 for (Entry *entry in appDelegate.entries)
 {
   NSComparisonResult result = [entry.gurmukhiEntry compare:searchText options:(NSCaseInsensitiveSearch|NSDiacriticInsensitiveSearch) range:NSMakeRange(0, [searchText length])];
   if (result == NSOrderedSame)
   {
    [self.filteredListContent addObject:entry];
   }
 }

 [self.searchDisplayController.searchResultsTableView performSelectorOnMainThread:(@selector(reloadData)) withObject:nil waitUntilDone:NO];
 //[self.searchDisplayController.searchResultsTableView reloadData];

 [apool drain];
 isSearching = NO; }

- (BOOL)searchDisplayController:(UISearchDisplayController *)controller shouldReloadTableForSearchString:(NSString *)searchString {
     if (!isSearching) {
      [self.filteredListContent removeAllObjects]; // First clear the filtered array.
      [self performSelectorInBackground:(@selector(filterContentForSearchText:)) withObject:searchString];
     }
     //[self filterContentForSearchText:searchString];

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

2 个答案:

答案 0 :(得分:0)

有几件事:

  • 多线程不应该在单个核心CPU上带来任何性能提升。如果你认为你看到了很好的加速,那么你的算法可能很可疑。
  • 如果访问共享变量,请确保它是线程安全的。您似乎正在将搜索结果写入一个共享对象。如果没有同步,这将失败。
  • 该代码看起来好像所有线程都在完全相同的数据集上工作,因此如果一个线程找到匹配项,其他线程将找到相同的内容并将其放在那里。
  • 当从主线程访问时,不要忘记同步对“结果对象”的访问。

答案 1 :(得分:0)

您可能想要了解NSOperation。考虑创建NSOperation的子类,并添加一个作为您发布的文件中实现的类的属性。

然后在 - (BOOL)searchDisplayController:(UISearchDisplayController *)控制器shouldReloadTableForSearchString:(NSString *)searchString {

您可以使用指向搜索数据和文本的指针设置对象。然后你可以检查对象当前是否正在运行(我认为),如果是,请在其上调用'cancel'并使用新的搜索字符串重新开始。可能有一种更聪明的方式,但我怀疑NSOperation是一个开始寻找的好地方。