我正在尝试向线程添加多个计时器,而不是主线程。这是代码:
- (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。我想知道为什么?
答案 0 :(得分:3)
您一次只能看到一个计时器的原因在于您的调度块的最后一行:
-[NSRunLoop run]
是一个阻塞调用,当运行循环的最后一个输入源完成并且不再安排定时器时返回。
此外,GCD队列是严格的FIFO,您正在创建一个串行队列。
因此,您多次点击该按钮的结果是一个队列,在没有第一个块完成的情况下变得更加饱满和充实:
由于计时器正在重复,因此在运行循环中总会有一些事情被调度,因此run
永远不会返回,从而禁止调用所有后续块。