に複数のタイマーを追加する方法ではなく、メインthread.Hereはコードです:私がスレッドに複数のタイマーを追加しようとしているスレッド
- (IBAction)addTimer:(id)sender
{
if (!_timerQueue) {
_timerQueue = dispatch_queue_create("timer_queue", NULL);
}
dispatch_async(_timerQueue, ^{
NSTimer *tempTimer = [NSTimer scheduledTimerWithTimeInterval:1 target:self selector:@selector(timerAction) userInfo:nil repeats:YES];
[[NSRunLoop currentRunLoop] addTimer:tempTimer forMode:NSRunLoopCommonModes];
[[NSRunLoop currentRunLoop] run];
});
}
上記の方法は、ボタンアクションによってトリガーされます。しかし、ディスパッチブロック内のコードは、ボタンを何回クリックしても1回だけ実行されます。そのスレッドでは1つのタイマーだけです。なぜだろう?
-[NSRunLoop run]
は、実行ループが終了の最後の入力ソースなしタイマーがあるときに返すブロッキング・コールです:
+ scheduledTimerWithTimeInterval ...家族は、すでに現在の実行ループにスケジュールタイマーを返します。 timerTimerWithTimeInterval:1ターゲット:セルフセレクタ:@セレクタ(timerAction)userInfo:nil repeat:YES]; [[NSRunLoop currentRunLoop] addTimer:tempTimer forMode:NSRunLoopCommonModes]; [[NSRunLoop currentRunLoop] run]; ' – Ariel
あなたは方法を複雑にしています。なぜスレッドを使うのですか?メインスレッドでタイマーをスケジュールし、必要に応じて高価な操作をバックグラウンドにディスパッチすることができます。本当にスレッドが必要な場合は、GCDを使用しないでください。 'NSThread'で' NSPort'のようなソースを実行ループに入れて終了しないようにスレッドを作成し、実行ループを実行してください。次に、 '-performSelector:onThread:...'を使ってタイマーを追加します。 –
あなたのアドバイスありがとう、ケン。私はそのディスパッチスレッドにいくつかのディスパッチタイマーソースを追加することによって問題を解決しました。実際、私はNSThreadについてほとんど学びません。これまでに見たビデオから、GCDをもっと頻繁に使うようになった。私はちょうどGCDとNSThreadがほぼ同じことをしていると思います... – Tranz