0

私は自分のメソッドの1つを実行する新しいスレッドを作成しています:今私がやっていることは次のとおりです:

NSThread *thread = [[NSThread alloc] initWithTarget:self selector:@selector(myThreadFunc) object:nil];
[thread start];

myThreadFunc で

{
     while(isRunning){
         [self updateSomething];
         [NSThread sleepForTimeInterval:3.0];
     }
     NSLog(@"out");
}

別の関数では、設定isRunning = NOおよびthread = nilまたは[thread cancel]しかしmyThreadFuncスリープしているため、スレッドを終了できません。このケースを制御するにはどうすればよいですか? 本当にありがとう。

4

1 に答える 1

1

スレッドを使用しないでください。タイマーを使用します。何かが高価な場合は、メイン キュー以外のキューにディスパッチし、状態変数を設定して、まだ実行中であることを示します (何かが同時に実行されることを意図していない場合)。次に、タイマーをキャンセルします。タイマー コールバック関数の簡単な例を次に示します。

- (void)doSomething:(NSTimer*)timer
{
  // this assumes that this "something" only ever
  // runs once at a time no matter what, adjust this
  // to an ivar if it's per-class instance or something
  static BOOL alreadyDoingSomething = NO;
  if( alreadyDoingSomething ) return;
  alreadyDoingSomething = YES;
  dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
    [self updateSomething];
    alreadyDoingSomething = NO;
  });
}

ここで、単にタイマーをキャンセルすると、これは実行を停止します。再開する準備ができたら、このメソッドを指定されたセレクターとして新しいタイマーをスケジュールします。これを上記の例と同様に動作させるには、タイマー間隔を 3 秒に設定します。

于 2012-09-20T04:52:17.423 に答える