objective-c cocoa nstimer nsrunloop

objective c - ¿Cómo "validar" un NSTimer después de invalidarlo?



objective-c cocoa (2)

No puedes usar el temporizador invalidado.

De Apple Docs:

Una vez programado en un ciclo de ejecución, el temporizador se dispara en el intervalo especificado hasta que se invalida. Un temporizador de no repetición se invalida inmediatamente después de dispararse. Sin embargo, para un temporizador de repetición, debe invalidar el objeto del temporizador usted mismo llamando a su método de invalidación. Al llamar a este método, se solicita la eliminación del temporizador del bucle de ejecución actual; como resultado, siempre debe llamar al método de invalidar desde el mismo hilo en el que se instaló el temporizador. Invalidar el temporizador lo desactiva inmediatamente para que ya no afecte el bucle de ejecución. El bucle de ejecución luego elimina y libera el temporizador, ya sea justo antes de que se devuelva el método de invalidación o en algún momento posterior. Una vez invalidados, los objetos del temporizador no pueden ser reutilizados.

Básicamente, tengo este temporizador que debe repetirse cuando recibe un evento clave e invalida cuando el usuario libera la clave. Sin embargo, no puedo "validar" el temporizador nuevamente ni siquiera llamando a addTimer:forMode: en NSRunLoop. ¿Alguien sabe por qué sucede esto y cómo puedo solucionarlo? Gracias.


Una vez que haya invalidado un NSTimer, no debe usarlo nuevamente.

En su lugar, cree una nueva instancia de temporizador y use esa instancia para agregarla al método addTimer de NSRunLoop. Personalmente, prefiero simplemente llamar al programadoTimerWithTimeInterval de NSTimer porque hace todo de una vez.

De los docs NSTimer:

Al llamar a este método, se solicita la eliminación del temporizador del bucle de ejecución actual; como resultado, siempre debe llamar al método de invalidar desde el mismo hilo en el que se instaló el temporizador. Invalidar el temporizador lo desactiva inmediatamente para que ya no afecte el bucle de ejecución. El bucle de ejecución luego elimina y libera el temporizador, ya sea justo antes de que se devuelva el método de invalidación o en algún momento posterior. Una vez invalidados, los objetos del temporizador no pueden ser reutilizados.