受@PeterHosey在这个问题中有趣的评论的启发,我决定实现使用时间跟踪系统。
喜欢:
- 应用程序启动,计数器启动
- 应用程序终止,记录整个持续时间
- 在任何时候(即使在执行过程中),如果总使用时间超过允许的时间,用户都会收到通知
然而,我有几个。。。概念问题:
- 我要追踪什么?
[NSDate date]
是否足够 - 如果用户只是在某个时刻更改了他的系统日期/时间,该怎么办
- 此外,要挂接哪些特定的委托方法?我的意思是,你会在哪里调用计数函数的启动/停止例程
我洗耳恭听!:-)
好吧,我认为您不需要使用[NSDate-date]方法。为什么不使用mach_absolute_time()函数呢?要跟踪经过的时间,可能需要一些计时器(例如,每分钟一次)。
GCD定时器是实现定时器的一种简单灵活的方式,如果需要,您可以暂停并恢复定时器(例如,如果您想在程序不使用时暂停它)
- (void)createTimerSource
{
// myTimerQueue and trialTimer are class members
myTimerQueue = dispatch_queue_create("label.yourapp.com", NULL);
trialTimer = dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER, 0, 0, myTimerQueue);
dispatch_source_set_timer(m_ping_timer, dispatch_time(DISPATCH_TIME_NOW,TimerPeriod * NSEC_PER_MSEC), TimerPeriod * NSEC_PER_MSEC,NSEC_PER_SEC/10);
// set event handler
dispatch_source_set_event_handler(m_ping_timer,^{
// the code to check time elapsed
});
// set the cancel handler
dispatch_source_set_cancel_handler(m_ping_timer,^{
// release timer dispatch source
if(trialTimer)
dispatch_release(trialTimer);
// release dispatch timer
if(myTimerQueue)
dispatch_release(myTimerQueue);
});
// created sources always suspended
dispatch_resume(trialTimer); // to suspend the timer use dispatch_suspend(trialTimer)
}