【问题标题】:Nstimer count wrongNstimer 计数错误
【发布时间】:2012-11-19 02:07:50
【问题描述】:

我对 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

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

【问题讨论】:

  • 您的应用在这段时间里是空闲的还是在做很多其他的处理?
  • 我正在流式传输音频,需要使用计时器来计算何时停止流式传输。
  • 这段时间你的应用是否在后台运行?如果您的应用在后台,计时器不会运行。
  • 不,它还在播放屏幕中。
  • 那你贴的日志输出为什么会显示进程切换?

标签: iphone ios nstimer counter


【解决方案1】:

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 在主运行循环上工作,所以如果你阻塞了主线程,定时器在它被解除阻塞之前不会触发。

【讨论】:

  • 谢谢@zpasternack。我在 10 秒内测试。但我真的希望它每 100 毫秒工作一次。因为我的应用程序每 100 毫秒更新一次。我认为问题在于我创建了流式传输音频进程。当此进程运行时,它使计时器延迟。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-11-10
相关资源
最近更新 更多