Отслеживайте реальное время использования в приложении Какао

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

Нравится:

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

Однако у меня есть пара ... концептуальных проблем:

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

Я весь во внимании! :-)


person Dr.Kameleon    schedule 03.11.2014    source источник


Ответы (1)


Что ж, я не думаю, что для этого нужно использовать подход [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)
}
person Daniyar    schedule 03.11.2014
comment
Хм ... Большое спасибо за ответ. Я разбираюсь в этом! ;-) - person Dr.Kameleon; 03.11.2014