iOS: воссоздание таймеров обратного отсчета после смены часов? - PullRequest
2 голосов
/ 22 августа 2011

Я работаю над приложением для iOS, которое использует NSTimer для обратного отсчета.Это подвержено вмешательству пользователя: если, например, пользователь выходит из приложения, закрывает приложение вручную, изменяет часы устройства и возвращается, таймер должен быть воссоздан.Другой сценарий: пользователь блокирует устройство, он переходит в режим пониженного энергопотребления (который требует повторного создания таймеров), и часы автоматически устанавливаются перед повторным открытием игры.Если это произойдет, у меня не будет точного способа определить, сколько времени прошло с момента закрытия приложения, поскольку часы устройства изменились.

Tl; dr: таймеры обратного отсчета иногда приходится воссоздавать послеизменение часов устройства.Как обычно решается эта проблема?

Ответы [ 2 ]

3 голосов
/ 22 августа 2011

Каждый раз, когда вы полагаетесь на системные часы для точного определения времени, у вас будут проблемы, даже если пользователь не намеренно вмешивается в эти часы.Как правило, дрейф часов корректируется путем небольшого увеличения или уменьшения длины секунды, чтобы позволить часам сместиться обратно к центру в течение нескольких минут.Если вам нужна точная синхронизация, вы можете использовать что-то вроде mach_absolute_time(), которое связано с временем работы системы, а не системными часами, или вы можете использовать Grand Central Dispatch.Функция dispatch_after() принимает значение dispatch_time_t, которое может быть выражено либо через настенное время (например, системные часы), либо как смещение против DISPATCH_TIME_NOW (которое игнорирует настенные часы).

0 голосов
/ 23 августа 2011

Для дальнейшего использования в отношении различных систем хронометража в OSX (и, следовательно, iOS):

Один из способов измерения скорости любой операции, включая время запуска, это использовать системные процедуры, чтобы получить текущее время в начале и конец операции. Если у вас есть два значения времени, вы можете взять разница и запись результатов.

Преимущество этого метода в том, что он позволяет измерять длительность конкретных блоков кода. Mac OS X включает в себя несколько разные способы узнать текущее время:

  • mach_absolute_time читает регистр временной базы ЦП и является основа для других функций измерения времени.
  • Функция Core Services UpTime обеспечивает наносекундное разрешение для измерения времени.
  • Функция BSD gettimeofday (объявлена ​​в <sys/time.h>) обеспечивает
    микросекундное разрешение. (Обратите внимание, что эта функция требует некоторых затрат, но все еще точен для большинства применений.)
  • В Какао вы можете создать объект NSDate с текущим временем в начало операции, а затем используйте
    timeIntervalSinceDate: метод для получения разницы во времени.

Источник: Руководство по производительности времени запуска, "Сбор метрик времени запуска" .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...