1

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

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

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

4

1 回答 1

4

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

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

此外,GCD 队列是严格的 FIFO 并且您正在创建一个串行队列。因此,您多次点击该按钮的结果是队列变得越来越满,而第一个块没有完成:
由于计时器在重复,因此运行循环中总是有一些计划,因此run永远不会返回,除非所有后续块从被调用。

于 2012-04-12T20:36:49.663 回答