2012-02-13 7 views
19

Básicamente, tengo este temporizador que debe repetirse cuando recibe un evento clave, e invalida cuando el usuario suelta la clave. Sin embargo, no puedo "validar" el temporizador incluso llamando al addTimer:forMode: en NSRunLoop. ¿Alguien sabe por qué está sucediendo esto y cómo puedo solucionarlo? Gracias.¿Cómo "validar" un NSTimer después de invalidarlo?

Respuesta

36

No puede usar el temporizador invalidado.

de Apple Docs:

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

+0

Curiosamente, hay NSRunLoop addTimer pero no hay RemoveTimer que podría haber sido útil para detener el temporizador de disparar sin invalidarlo. Debe ser que la creación del temporizador es más barata que la creación de puertos para que Apple no se moleste en agregar esa API. –

13

Una vez que haya invalidado un NSTimer, no debe volver a utilizarlo.

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

De NSTimer docs:

llamada a este método solicita la retirada del contador de tiempo de la corriente de bucle plazo; como resultado, siempre debe llamar al método de invalidación desde el mismo subproceso en el que se instaló el temporizador. Invalidando , el temporizador lo desactiva inmediatamente para que no afecte más al ciclo de ejecución . El ciclo de ejecución luego elimina y libera el temporizador, ya sea solo antes de que el método de invalidación regrese o en algún momento posterior. Una vez que se invalida, los objetos del temporizador no pueden reutilizarse.

+0

Derecho, no sabía que ... ¡Gracias! – TheAmateurProgrammer