2010-09-24 100 views
2

我的应用程序中有一个需求,如果应用程序/ iPad上没有发生约3小时的活动,我需要向用户显示一些消息。 我认为有一个NSTimer将在启动时开始的解决方案。如果用户执行任何操作,我将使计时器无效并启动一个新计时器。但是,应用程序上有视频回放,就我所知,用户可能正在观看视频约3小时,并且在此期间不会执行其他操作,并且仍会收到该消息。在iPhone/iPad的NSTimer和加速度计

所以,另一种方法是无效,每次检测到ipad/iphone移动时启动计时器。换句话说,使用加速度计并在回调中检测加速度,我可以使无效并再次创建计时器。 但我担心这种方法即使对于最小的运动,定时器也必须失效并重新创建。这种方法会不会影响性能?

感谢和问候, hetal

回答

0

创建一个定时器不昂贵的一个特点,但它仍然有点贵。

的好消息是,你可以任意更改消防日期:

[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秒)。

0

苹果公司在多任务,他们称之为“任务完成”的- (UIBackgroundTaskIdentifier)beginBackgroundTaskWithExpirationHandler:(void(^)(void))handler 使用中发现here和更多的东西here

+0

这不符合目的。我需要检测3小时绝对没有活动或移动。所以,即使最轻微的动作也需要使旧计时器失效并启动另一个计时器。有关性能影响的任何想法? – 2010-09-24 19:59:57

+0

看到我的新编辑 – 2010-09-24 20:38:01

0

无论何时视频启动,您都不能只发送消息给NSTimer,以使计时器失效吗?然后当电影结束时,启动计时器备份。