2014-11-03 8 views
3

Вдохновленный интересным комментарием @ PeterHosey в this question, я решил внедрить систему отслеживания времени использования.Отслеживать реальное время использования в приложении Cocoa

Как:

  • начинает приложение, счетчик начинает
  • приложение завершается, вся продолжительность регистрируется
  • В любой момент (даже во время выполнения), что общее время использования превышает допустимое время, пользователь получает уведомление

Однако у меня есть пара ... conceptu al issues:

  • Что я буду отслеживать? Достаточно ли [NSDate date]?
  • Что делать, если пользователь просто меняет свою системную дату/время в какой-то момент?
  • Кроме того, какие конкретные методы делегата должны быть подключены? Я имею в виду, где бы вы назвали процедуры запуска/остановки для функций подсчета?

Я все уши! :-)

ответ

3

Ну, я не думаю, что вам нужно использовать [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) 
} 
+0

Хмм ... Большое спасибо за ваш ответ. Я изучаю это! ;-) –

 Смежные вопросы

  • Нет связанных вопросов^_^