0

私はあらゆる種類のマルチスレッドに慣れていないので、バックグラウンドスレッドで適切に機能する単純な検索方法を取得できないようです。メインスレッドで 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.  }
4

2 に答える 2

0

いくつかのこと:

  • シングル コア CPU では、マルチスレッド化によってパフォーマンスが向上することはありません。大幅な高速化が見られると思われる場合は、おそらくアルゴリズムが怪しいものです。
  • 共有変数にアクセスする場合は、スレッドセーフであることを確認してください。検索結果を 1 つの共有オブジェクトに書き込んでいるようです。これは、同期しないと失敗します。
  • そのコードは、すべてのスレッドがまったく同じデータセットで動作するように見えるため、1 つのスレッドが一致を見つけた場合、他のスレッドも同じものを見つけてそこに配置します。
  • メインスレッドからアクセスするときは、「結果オブジェクト」へのアクセスも同期することを忘れないでください。
于 2010-06-17T23:01:33.140 に答える
0

NSOperation を調べることができます。NSOperation のサブクラスを作成し、投稿したファイルに実装されているクラスのプロパティとして追加することを検討してください。

次に - (BOOL)searchDisplayController:(UISearchDisplayController *)controller shouldReloadTableForSearchString:(NSString *)searchString {

検索データとテキストへのポインターでオブジェクトを設定できます。次に、オブジェクトが現在実行されているかどうかを確認し (私が思うに)、実行されている場合は、「キャンセル」を呼び出して、新しい検索文字列で最初からやり直します。よりスマートな方法があるかもしれませんが、NSOperation は探し始めるのに適した場所だと思います。

于 2010-06-17T23:05:51.867 に答える