1

我有一个简单的 OSX 菜单栏应用程序,状态项附有一个菜单,我有一个可以手动发送fire到 NSTimer 的菜单项。

我希望该菜单项显示下一次触发计时器之前的秒数。有没有办法获得下一次火灾的时间或 NSTimer 下一次被解雇的时间?

4

2 回答 2

4

NSTimer 具有返回 NSDate 的 fireDate。NSDate 有 timeIntervalSinceNow。

于 2013-01-07T01:56:29.533 回答
2

我知道已经有一个公认的答案,但我突然想到,您实际上可能对 , 根本不感兴趣fireDate

使用该日期,您只会看到相同的秒数,只要显示时间 - 如果它直接显示在菜单栏中,则没有进度指示......</p>

因此,我建议采用稍微不同的方法:

  1. 计算并存储到期日期。
  2. 安排一个重复计时器,该计时器以与您显示的精度匹配的间隔触发,并使用存储的到期日期更新剩余时间显示。
  3. 一旦过了有效期,就让计时器失效,然后做任何你想做的事情。

那么,为什么不使用一秒定时器和递减计数器变量呢?

简单:NSTimer不是实时的东西。计时器触发的实际日期,其计划fireDate将略有不同。但是由于重复计时器会重新安排时间而不调整该差异,因此这些偏差会加起来。

这些偏差是完全不可预测的,因为它们不仅取决于应用程序的负载,还取决于整个系统。所以它们会在“完全可以忽略不计”和“ZOMFG”之间变化!

于 2013-01-07T09:39:53.323 回答