Nstimer错了

时间:2012-11-19 02:07:51

标签: iphone ios nstimer counter

我遇到NSTimer问题。我开始并每隔100ms重复一次,我有一个计数器来检查我是否已经破了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

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

1 个答案:

答案 0 :(得分:3)

NSTimers不保证精确到超过100毫秒左右。 The NSTimer documentation说:

  

计时器不是实时机制;它只在其中一个发射时发射   已添加计时器的运行循环模式正在运行且能够运行   检查计时器的开火时间是否已经过去。因为各种各样   输入源一个典型的运行循环管理,有效的分辨率   计时器的时间间隔限制在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在主runloop上工作,所以如果你阻塞主线程,定时器在解除阻塞之前不会触发。