applicationDidEnterBackground с целочисленной итерацией - PullRequest
2 голосов
/ 27 октября 2010

Мой вопрос довольно прост (я думаю).У меня есть класс, который реализует простой хронометр (используя некоторые целые числа и NSTimer).Я хотел бы закрыть свое приложение (поэтому войдите в фоновый режим), но я бы хотел, чтобы мой хронометр продолжал считать.Как я могу справиться с этим?

Большое спасибо!

1 Ответ

1 голос
/ 27 октября 2010

Сохраните время, которое присутствовало при запуске таймера. Что-то вроде self.timerStartDate = [NSDate date];. Вызов NSTimer один раз в секунду и увеличение целого числа даст вам очень неточные результаты.
Из справочника NSTimer :

Таймер не является механизмом реального времени; он срабатывает только тогда, когда работает один из режимов цикла выполнения, к которому был добавлен таймер, и может проверить, прошло ли время срабатывания таймера. Из-за различных входных источников, которыми управляет типичный цикл выполнения, эффективное разрешение временного интервала для таймера ограничено порядка 50-100 миллисекунд. Если время срабатывания таймера происходит во время длинного вызова или когда цикл выполнения находится в режиме, который не контролирует таймер, таймер не срабатывает до следующей проверки цикла таймером. Следовательно, фактическое время срабатывания таймера потенциально может быть значительным периодом времени после запланированного времени срабатывания.

Если вы используете подход с сохранением startTime, ваш таймер даже «запускается», если программа не запущена


EDIT: да. неверно использовать таймер для подсчета времени.
Я просто написал небольшой тестовый пример. Приложение с простым табличным представлением с 12 строками. Два таймера, один срабатывает каждую миллисекунду, другой срабатывает каждые 10 секунд.
В первом таймере я добавляю 1 к целому числу, во втором я печатаю результат первого таймера и время, прошедшее с последнего напечатанного мной времени, измеренное с помощью mach_absolute_time ().
Посмотрите на различия, первые измерения вполне нормальны, но если я начну прокручивать в этом простом UITableView, который запускается в симуляторе на моем мощном Mac, вы получите большую разницу.

2010-10-27 11:16:49.266 MutliTableTest[24726:207] Calculated: 9.988000000000
2010-10-27 11:16:49.267 MutliTableTest[24726:207] Measured  : 10.000055888000
2010-10-27 11:16:59.266 MutliTableTest[24726:207] Calculated: 9.986000000000
2010-10-27 11:16:59.267 MutliTableTest[24726:207] Measured  : 9.999898500000
2010-10-27 11:17:09.608 MutliTableTest[24726:207] Calculated: 8.091000000000
2010-10-27 11:17:09.609 MutliTableTest[24726:207] Measured  : 10.341779530000
2010-10-27 11:17:19.266 MutliTableTest[24726:207] Calculated: 1.966000000000
2010-10-27 11:17:19.267 MutliTableTest[24726:207] Measured  : 9.658319274000
2010-10-27 11:17:29.266 MutliTableTest[24726:207] Calculated: 9.991000000000
2010-10-27 11:17:29.267 MutliTableTest[24726:207] Measured  : 9.999891531000

Так что не используйте NSTimer, используйте NSDate и получите разницу между текущим временем и startTime с чем-то вроде NSTimeInterval ti = [[NSDate date] timeIntervalSinceDate:self.startDate];

Но мне интересно, зачем вам разная временная метка каждую миллисекунду

...