如何向线程添加多个计时器

时间:2012-04-12 08:21:11

标签: objective-c nstimer grand-central-dispatch nsrunloop

我正在尝试向线程添加多个计时器,而不是主线程。这是代码:

- (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];
  });
}

上述方法由按钮操作触发。但是,无论我点击按钮多少次,调度块中的代码只运行一次。所以该线程中只有一个Timer。我想知道为什么?

1 个答案:

答案 0 :(得分:3)

您一次只能看到一个计时器的原因在于您的调度块的最后一行:

-[NSRunLoop run]是一个阻塞调用,当运行循环的最后一个输入源完成并且不再安排定时器时返回。

此外,GCD队列是严格的FIFO,您正在创建一个串行队列。 因此,您多次点击该按钮的结果是一个队列,在没有第一个块完成的情况下变得更加饱满和充实:
由于计时器正在重复,因此在运行循环中总会有一些事情被调度,因此run永远不会返回,从而禁止调用所有后续块。