Objective c 在Cocoa应用程序中跟踪实时使用情况

Objective c 在Cocoa应用程序中跟踪实时使用情况,objective-c,xcode,macos,cocoa,trialware,Objective C,Xcode,Macos,Cocoa,Trialware,受@PeterHosey在中的有趣评论的启发,我决定实施使用时间跟踪系统 如: 应用程序启动,计数器启动 应用程序终止,整个持续时间被记录 在总使用时间超过允许时间的任何时候(即使在执行期间),用户都会收到通知 不过,我有两个。。。概念问题: 我要追踪什么?[NSDate]就足够了吗 如果用户只是在某个时间点更改其系统日期/时间怎么办 另外,要挂接哪些特定的委托方法?我的意思是,你会在哪里调用计数函数的启动/停止例程 我洗耳恭听!:-) 好吧,我认为您不需要使用[NSDate]方法来解决

受@PeterHosey在中的有趣评论的启发,我决定实施使用时间跟踪系统

如:

  • 应用程序启动,计数器启动
  • 应用程序终止,整个持续时间被记录
  • 在总使用时间超过允许时间的任何时候(即使在执行期间),用户都会收到通知
不过,我有两个。。。概念问题:

  • 我要追踪什么?
    [NSDate]
    就足够了吗
  • 如果用户只是在某个时间点更改其系统日期/时间怎么办
  • 另外,要挂接哪些特定的委托方法?我的意思是,你会在哪里调用计数函数的启动/停止例程

我洗耳恭听!:-)

好吧,我认为您不需要使用[NSDate]方法来解决这个问题。为什么不使用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)
}