Возможно, это не является непосредственной причиной проблемы, с которой вы столкнулись, но я уже могу обнаружить одну серьезную ошибку.
Тот факт, что этот таймер устанавливается каждый раз на viewWillAppear
, означает, что всякий раз, когда появляется ваше представление, вы создаете новый таймер (и теряете старый), который будет срабатывать через 60 секунд после создания.
Если ваш вид исчезает и появляется снова несколько раз, у вас будет несколько таймеров, запускающих один и тот же метод с совершенно случайными интервалами.
Вам необходимо правильно управлять таймером. Если вы хотите, чтобы он запускался при первом создании вида и продолжал тикать / запускать, даже если вид не отображается, вам нужно создать его во время init
или viewDidLoad
, а затем обязательно остановить его, когда вы dealloc
или viewDidUnload
.
Если вы хотите, чтобы ваш таймер срабатывал только в том случае, если представление является текущим представлением, вам необходимо убедиться, что вы управляете остановкой и соответствующим образом запускаете таймер на viewDidAppear
и viewWillDisappear
.
Кроме того, как сказал Виллихам Тотланд в своем ответе, нельзя полагаться на NSTimer для точного определения времени. Об этом также говорится в документации:
Таймер не является механизмом реального времени; он срабатывает только тогда, когда работает один из режимов цикла выполнения, к которому был добавлен таймер, и может проверить, прошло ли время срабатывания таймера. Из-за различных входных источников, которыми управляет типичный цикл выполнения, эффективное разрешение временного интервала для таймера ограничено порядка 50-100 миллисекунд. Если время срабатывания таймера происходит, когда цикл выполнения находится в режиме, который не контролирует таймер, или во время длительного вызова, таймер не срабатывает до следующей проверки цикла таймером. Следовательно, фактическое время, в которое таймер срабатывает, может быть значительным периодом времени после запланированного времени срабатывания.
В этом случае, с промежутком времени в 60 секунд, не должно быть проблемой, что таймер не является точным, я думаю, что проблемы, которые вы видите, заключаются в том, что таймер не управляется должным образом.