Как «проверить» NSTimer после признания его недействительным? - PullRequest
21 голосов
/ 13 февраля 2012

Так что, в принципе, у меня есть этот таймер, который должен повторяться, когда он получает событие ключа, и становится недействительным, когда пользователь отпускает ключ. Однако я не могу «проверить» таймер обратно, даже вызвав addTimer:forMode: в NSRunLoop. Кто-нибудь знает, почему это происходит и как я могу это исправить? Благодаря.

Ответы [ 2 ]

37 голосов
/ 13 февраля 2012

Вы не можете использовать недействительный таймер.

Из документов Apple:

После того, как запланировано на цикл выполнения, таймер срабатывает в указанный интервал, пока он не станет недействительным. Неповторяющийся таймер делает недействительным Сам сразу после того, как он стреляет. Однако для повторяющегося таймера вы Вы должны аннулировать объект таймера самостоятельно, вызвав его метод. Вызов этого метода запрашивает удаление таймера из текущий цикл запуска; в результате вы всегда должны вызывать аннулирование метод из того же потока, в котором был установлен таймер. Аннулирование таймера немедленно отключает его, чтобы он больше не влияет на цикл выполнения. Затем цикл выполнения удаляет и освобождает таймер, либо непосредственно перед возвратом метода invalidate, либо позже точка. Будучи недействительными, объекты таймера не могут быть повторно использованы.

14 голосов
/ 13 февраля 2012

После того как вы аннулировали NSTimer, вы не должны использовать его снова.

Вместо этого создайте новый экземпляр таймера и используйте этот экземпляр для добавления в метод addTimer NSRunLoop.Лично я предпочитаю просто вызвать NSTimer's scheduleTimerWithTimeInterval, потому что он делает все за один снимок.

Из NSTimer документы :

Вызов этого метода требует удаления таймератекущий цикл выполнения;в результате вы всегда должны вызывать метод invalidate из того же потока, в котором был установлен таймер.Аннулирование таймера немедленно отключает его, чтобы он больше не влиял на цикл выполнения.Затем цикл выполнения удаляет и освобождает таймер либо непосредственно перед возвратом метода invalidate, либо в какой-то более поздний момент.Будучи недействительными, объекты таймера не могут быть повторно использованы.

...