Расписание таймера с NSTimer делает задачу быстрее, чем ожидалось - PullRequest
1 голос
/ 15 марта 2010

Я планирую таймер с функцией NSTimer в viewWillAppear следующим образом:

minutesTimer = nil;
minutesTimer = [NSTimer scheduledTimerWithTimeInterval:60 target:self selector:@selector(updateScrollViewItems) userInfo:NULL repeats:YES];

С этим вызовом функции я ожидаю, что он будет вызывать селектор updateScrollViewItems каждую минуту, но это не так, он обновляет элементы быстрее, чем ожидалось (около нескольких секунд).

В чем причина этого неожиданного поведения?

Ответы [ 3 ]

5 голосов
/ 15 марта 2010

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

Тот факт, что этот таймер устанавливается каждый раз на viewWillAppear, означает, что всякий раз, когда появляется ваше представление, вы создаете новый таймер (и теряете старый), который будет срабатывать через 60 секунд после создания.

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

Вам необходимо правильно управлять таймером. Если вы хотите, чтобы он запускался при первом создании вида и продолжал тикать / запускать, даже если вид не отображается, вам нужно создать его во время init или viewDidLoad, а затем обязательно остановить его, когда вы dealloc или viewDidUnload.

Если вы хотите, чтобы ваш таймер срабатывал только в том случае, если представление является текущим представлением, вам необходимо убедиться, что вы управляете остановкой и соответствующим образом запускаете таймер на viewDidAppear и viewWillDisappear.

Кроме того, как сказал Виллихам Тотланд в своем ответе, нельзя полагаться на NSTimer для точного определения времени. Об этом также говорится в документации:

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

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

0 голосов
/ 13 декабря 2010

Если вы хотите, чтобы ваш таймер только тик / огонь, когда вид является текущим вид, то вам нужно убедиться, что вы управление остановкой и запуском таймер соответственно на viewDidAppear и просмотр исчезнет.

Спасибо за эту информацию, хотя я не являюсь ОП этой темы, я искал ответ на подобную проблему. Я несколько дней чесал голову, искал по всему интернету, но не мог найти ответ. Наконец-то я нашел эту ветку. Это ценная информация для меня.

0 голосов
/ 15 марта 2010

в айфоне много чего; и аккуратное устройство, однако; Как и любой другой компьютер, точные часы это не так. Однако, кажется, что рассматриваемый метод принимает NSTimeInterval, который является двойным. Вы можете изменить это на 60.0.

...