Подтвердить что ты не робот

Как "проверить" NSTimer после его недействительности?

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

4b9b3361

Ответ 1

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

Из Apple Docs:

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

Ответ 2

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

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

Из NSTimer docs:

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