0

我对 NSTimer 有疑问。我每 100 毫秒开始并重复一次,我有一个计数器来检查我是否运行了 10 秒。问题是它在近 1 分钟内停止,而不是在 10 秒内停止。这是我的代码

timer = [NSTimer scheduledTimerWithTimeInterval:0.1 target:self selector:@selector(checkTimer) userInfo:nil repeats:YES];

-(void)checkTimer
{

    timerCount += 1;

        if(timerCount == 1)
        {
                NSLog(@"start");
        }

        if(timerCount == 103)
        {
            NSLog(@"i got it");
        }
}

这是日志:

2012-11-19 08:57:42.063 Karagram[11708:540b] start
[Switching to process 8707 thread 0x2203]
2012-11-19 08:58:39.514 Karagram[11708:540b] i got it

我不明白为什么它错了。有人可以告诉我为什么吗?谢谢。

4

1 回答 1

3

NSTimers 不能保证在超过 100 毫秒左右的范围内准确。 NSTimer 文档说:

定时器不是实时机制;它仅在已添加计时器的运行循环模式之一正在运行并且能够检查计时器的触发时间是否已过时触发。由于典型的运行循环管理的各种输入源,计时器的时间间隔的有效分辨率被限制在 50-100 毫秒的数量级。如果在长时间调用期间或运行循环处于不监视计时器的模式下发生计时器的触发时间,则计时器不会触发,直到下一次运行循环检查计时器。因此,定时器触发的实际时间可能是计划触发时间之后的一个重要时间段。

通过让它每 100 毫秒触发一次,您正在加剧错误,因为如果它每 100 毫秒关闭 50 毫秒,那么到 10 秒过去时,它可能与您的预期相差甚远。

如果您想在 10 秒后采取一些行动,为什么不将计时器设置为在 10 秒后触发呢?

NSLog( @"start" );
timer = [NSTimer scheduledTimerWithTimeInterval:10.0 target:self selector:@selector(checkTimer) userInfo:nil repeats:YES];

-(void)checkTimer
{
    NSLog(@"i got it");
}

另外,您是否在主线程上进行流式传输?NSTimers 在主运行循环上工作,所以如果你阻塞了主线程,定时器在它被解除阻塞之前不会触发。

于 2012-11-19T02:57:06.517 回答