我遇到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
我不明白为什么错。有人可以告诉我为什么? 感谢。
答案 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上工作,所以如果你阻塞主线程,定时器在解除阻塞之前不会触发。