创建一个定时器不是昂贵的一个特点,但它仍然有点贵。
的好消息是,你可以任意更改消防日期:
[timer setFireDate:[NSDate dateWithTimeIntervalSinceNow:3*60*60]];
或者,非常轻微更少的开销:
CFRunLoopTimerSetNextFireDate((CFRunLoopTimerRef)timer, CFAbsoluteTimeGetCurrent()+3*60*60);
(我认为CFAbsoluteTimeGetCurrent()开销超过目标创造的开销,但是meh。)
稍好的解决方案可能是离开计时器大部分时间都在;只需更新“上次活动”时间戳即可。计时器触发时,请查看“上次活动”时间戳。如果超过3小时前,则显示通知。如果小于3小时前,则适当设置下一个启动日期;这意味着计时器最多每1.5小时触发一次(平均),这可能是可能是并不像重复更改启动日期那样昂贵。
请参阅mach_absolute_time()
了解相对较低的开销时基(预先计算以mach_absolute_time为单位的3小时)。它仍然需要大约3微秒,这实际上是永远(1000个时钟周期!)。
如果你是真的担心开销,每次发生事情时只需设置一个“活动”标志,并使用(例如)1小时定时器。当定时器启动时,请执行类似if (activity) {counter = 0; activity = 0; } else { counter ++; if (counter == 3) { ... } }
的操作。在这里和那里几微秒是否比每小时发射一次计时器更昂贵是值得商榷的,但它们都很微不足道。
更大的问题是加速度计吃电源和CPU时间(并提供更新需要CPU时间)。设置为updateInterval = 10
左右会降低开销,并且操作系统将其限制在一个合理的值(大约1秒)。
这不符合目的。我需要检测3小时绝对没有活动或移动。所以,即使最轻微的动作也需要使旧计时器失效并启动另一个计时器。有关性能影响的任何想法? – 2010-09-24 19:59:57
看到我的新编辑 – 2010-09-24 20:38:01