gpt4 book ai didi

objective-c - NSTimer 是否可以在指定时间之前触发?

转载 作者:行者123 更新时间:2023-12-03 17:03:48 25 4
gpt4 key购买 nike

我一直在使用 NSTimers 来触发我的应用程序中的某些对时间敏感的事件(基本上,当我告诉它们以第二个分辨率发生时,这些事件必须发生)。但是,我曾经遇到过,有时计时器之前会触发,因此如果我记录计时器触发的日期,它可能会显示 14:34:59而不是14:35:00 。这有点烦人。我搜索了docs寻求解释并发现:

  • 由于典型的运行循环管理各种输入源,定时器时间间隔的有效分辨率限制为大约 50-100 毫秒。

还有这个:

  • 如果计时器的触发时间发生在长标注期间或run Loop 处于不监视定时器的模式,定时器在运行循环下次检查计时器之前不会触发。

因此计时器的分辨率为 100 毫秒,这可以解释计时器之前触发的原因,但前提是这有意义。之所以没有这样,是因为人们会认为 100 毫秒的差异是由延迟引起的,而不是相反。

那么,1:为什么计时器会在其时间之前触发,2:我该如何避免这种情况?

编辑:

这就是我计算日期的方式:

  1. 我从 NSDate 对象开始([NSDate now] 或来自 NSDatePicker 的日期)
  2. 我使用 NSDateComponents 添加到该日期 x
  3. 我再次使用 NSDateComponents 设置该日期的小时、数字和秒(但保留第 2 步中的日/月/年)
  4. 我这样设置计时器:

    timer = [NSTimertimerWithTimeInterval: 10 目标: self 选择器: @selector(myMethod) userInfo: nil 重复: NO];

    [定时器setFireDate:fireDate];

    [[NSRunLoop currentRunLoop] addTimer: 定时器 forMode: NSRunLoopCommonModes];

编辑2:

我还记录了时间间隔(而不是小时/分钟/秒),它始终是 x.0000 ,这意味着它正好在第二秒的开始处,正是它应该的样子(不是之前,也不是之后)。

最佳答案

您可能错误地计算了时间间隔(秒)。请注意,这是一个 NSTimeInterval,它被定义为 double。您是否有机会将时间间隔四舍五入到最接近的秒数?在这种情况下,当舍入时,计时器会过早触发。

编辑:确实有经验证据表明 NSTimer 可能会提前触发。我的猜测是,文档中提到的准确性不仅仅是 + 而是 +/-,并且运行循环按照 if(fireDelta>-0.0xxx) then fireNow();.

因此要解决这个问题:

  • 始终在触发时间上添加一个小的增量,并希望增量足够(丑陋且无法保证)

  • 当计时器触发时,执行 if(timer.fireDate.timeIntervalSinceNow>0.0) then 并使用相同的 fireDate 重新安排计时器。还是丑……

关于objective-c - NSTimer 是否可以在指定时间之前触发?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16483918/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com