2012-04-12 18 views
0

に複数のタイマーを追加する方法ではなく、メイン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]は、実行ループが終了の最後の入力ソースなしタイマーがあるときに返すブロッキング・コールです:

+0

+ scheduledTimerWithTimeInterval ...家族は、すでに現在の実行ループにスケジュールタイマーを返します。 timerTimerWithTimeInterval:1ターゲット:セルフセレクタ:@セレクタ(timerAction)userInfo:nil repeat:YES]; [[NSRunLoop currentRunLoop] addTimer:tempTimer forMode:NSRunLoopCommonModes]; [[NSRunLoop currentRunLoop] run]; ' – Ariel

+0

あなたは方法を複雑にしています。なぜスレッドを使うのですか?メインスレッドでタイマーをスケジュールし、必要に応じて高価な操作をバックグラウンドにディスパッチすることができます。本当にスレッドが必要な場合は、GCDを使用しないでください。 'NSThread'で' NSPort'のようなソースを実行ループに入れて終了しないようにスレッドを作成し、実行ループを実行してください。次に、 '-performSelector:onThread:...'を使ってタイマーを追加します。 –

+0

あなたのアドバイスありがとう、ケン。私はそのディスパッチスレッドにいくつかのディスパッチタイマーソースを追加することによって問題を解決しました。実際、私はNSThreadについてほとんど学びません。これまでに見たビデオから、GCDをもっと頻繁に使うようになった。私はちょうどGCDとNSThreadがほぼ同じことをしていると思います... – Tranz

答えて

3

あなたは一度に1つのタイマーを参照してください理由は、あなたの派遣ブロックの最後の行にありますもう予定はありません。

また、GCDキューは厳密にFIFOであり、シリアルキューを作成しています。 はこのようにして、そのボタンを数回タップするあなたの結果はこれまでに仕上げ最初のブロックせずに充実し、充実を取得するキューです:タイマーを繰り返している
ので、そこには常に実行ループ上でスケジュール何かがあるので、runを返すことはありません、それ以降のすべてのブロックが呼び出されることはありません。あなたが最初にそれらを実行ループを与えるか `NSTimer * tempTimer = [NSTimerのように... + timerWithTimeIntervalを使用する必要がありますので、

+0

ああ、そうだ。それはそれらの "奇妙な"ものを説明します。ありがとうdanyowdee。 – Tranz

関連する問題