1

アプリに検索機能があり、ユーザーがtextFieldを入力します。テキストが変更されると、ローカルデータベースを検索し、テーブルにデータを入力します。

入力したテキストにもよりますが、検索には1秒から10秒かかることがあるので、スレッドを使用することにしました。テキストが変更されるたびに、スレッドをキャンセルして(すでに実行されている場合)、新しいキーワードでスレッドを再開します。問題は、ドキュメントによると、cancelを呼び出しても、スレッドが強制終了されることを保証しないということです。では、ここでの解決策は何ですか?

スレッドを強制終了する方法はありますか?

- (void)populateData
{
   if (self.searchThread.isExecuting)
   {
       [self.searchThread cancel];
   }

   [self.searchThread start];
}

- (void)populateDataInBackground
{
   @autoreleasepool
   {
      // get data from db
      // populate table on main thread
   }
}
4

3 に答える 3

4

スレッドは後で再利用されるため、必ずしも死ぬ必要はありません (スレッドの作成にはコストがかかります)。すべきことは、作業をできるだけ多くの部分に分割し、各部分の間にスレッドのisCancelledプロパティが であるかどうかを確認することですYES。その場合は、更新せずに戻ります。

[NSThread currentThread]あなたが中にいる間にあなたのスレッドを返す必要がありますpopulateDataInBackground

于 2012-07-19T04:26:59.127 に答える
2

テストのためだけに、一度に10個のアイテムを返すようにdataStorageを変更することになりました。後で別の番号を使用する可能性があります。このようにして、whileループでスレッドを終了できます。

もう1つの利点は、この方法で、すべてのデータが取得されるのを待つのではなく、アイテムを調べながらテーブルにデータを入力できることです。

@interface ViewController

@property (nonatomic, strong) NSthread *searchThread;

@end

@implementation ViewController
@synthesize searchThread = _searchThread;

- (void)populateData
{
   [self.searchThread cancel];

   self.searchThread = [[NSThread alloc] initWithTarget:self selector:@selector(populateDataInBackground) object:nil];
   [self.searchThread start];
}

- (void)populateDataInBackground
{
   @autoreleasepool
   {
      [self.array removeAllObjects];

      // I added paging functionality to my sql, so I get let's say 10 records at a time
      while (/*has data*/)
      {
          NSArray *arrayOf10 = [self.dataStorage getdatafromIndex:startingIndex withCount:10];

          if ([[NSThread currentThread] isCancelled])
               [NSThread exit];

          [self.array addObjects:arrayOf10];
          [self.tableView performSelectorOnMainThread:@Selector(reloadData) withObject:nil waitUntilDone:NO];
      }
   }
}

@end
于 2012-07-19T06:31:11.987 に答える
1

考えられるいくつかの解決策の 1 つに、次のものが含まれます。

BOOLメイン スレッド (例: " ") から " " セマフォ / プロパティを設定し、バックグラウンド スレッド / タスクsearchNowを処理している間、定期的に読み取ります。populateData

searchNow状態が "NO" に変わった場合 (" " == YES は、タスクを続行する必要があることを意味すると仮定)、バックグラウンド スレッドを終了します。

于 2012-07-19T04:24:36.040 に答える