¿Cómo uso un NSTimer
? ¿Alguien puede darme instrucciones paso a paso?
objective-c
cocoa
nstimer
lab12
fuente
fuente
Respuestas:
En primer lugar, me gustaría llamar su atención sobre la documentación de Cocoa / CF (que siempre es un excelente primer puerto de escala). Los documentos de Apple tienen una sección en la parte superior de cada artículo de referencia llamada "Guías complementarias", que enumera las guías para el tema que se está documentando (si existe). Por ejemplo, con
NSTimer
, la documentación enumera dos guías complementarias:Para su situación, es probable que el artículo Temas de programación del temporizador sea el más útil, mientras que los temas de subprocesos están relacionados pero no los más directamente relacionados con la clase que se está documentando. Si echa un vistazo al artículo de Temas de programación del temporizador, se divide en dos partes:
Para los artículos que toman este formato, a menudo hay una descripción general de la clase y para qué se usa, y luego un código de muestra sobre cómo usarlo, en este caso en la sección "Uso de temporizadores". Hay secciones sobre "Crear y programar un temporizador", "Detener un temporizador" y "Administración de memoria". A partir del artículo, la creación de un temporizador no repetido programado se puede hacer de la siguiente manera:
Esto creará un temporizador que se dispara después de 2,0 segundos y llama
targetMethod:
sobreself
con un argumento, que es un puntero a laNSTimer
instancia.Si luego desea ver con más detalle el método, puede consultar los documentos para obtener más información, pero también hay una explicación sobre el código.
Si desea detener un temporizador que es uno que se repite (o detener un temporizador que no se repite antes de que se active), debe mantener un puntero a la
NSTimer
instancia que se creó; a menudo esto tendrá que ser una variable de instancia para que pueda consultarlo en otro método. Luego puede llamarinvalidate
a laNSTimer
instancia:También es una buena práctica
nil
eliminar la variable de instancia (por ejemplo, si su método que invalida el temporizador se llama más de una vez y la variable de instancia no se ha establecidonil
y laNSTimer
instancia se ha desasignado, arrojará una excepción).Tenga en cuenta también el punto sobre la gestión de memoria al final del artículo:
fuente
YES
porrepeats:
cuando llamesscheduledTimerWithTimeInterval:target:selector:userInfo:repeats:
. Si lo hace, asegúrese de mantener una referencia a laNSTimer
instancia (es devuelta por el método) y siga el punto de Administración de memoria como se detalla anteriormente.target
yselector
. Por ejemplo, si su objetivo esself
y el selector estimerMethod:
, el método llamado cuando se dispara el temporizador setimerMethod:
define en elself
. Luego puede poner el código que desee en ese método, y se llamará al método cada vez que se active el temporizador. Tenga en cuenta que el método llamado cuando se activa el temporizador (que pasa comoselector:
) solo puede tomar un argumento (que cuando se llama es un puntero a laNSTimer
instancia).self
"Hay un par de formas de usar un temporizador:
1) temporizador programado y selector de uso
Como nota al margen, en lugar de usar un temporizador que no se repite y llama al selector después de un intervalo específico, puede usar una declaración simple como esta:
esto tendrá el mismo efecto que el código de muestra anterior; pero si desea llamar al selector cada enésima vez, use el temporizador con repeticiones: YES;
2) temporizador auto-programado
3) temporizador no programado y uso de invocación
y después de eso, inicias el temporizador manualmente cuando lo necesites así:
Y como nota, onTick: el método se ve así:
fuente
Algo como esto:
fuente
fuente
MyViewController
nunca se desasigna.fuente
A las respuestas les falta un temporizador específico de la hora del día aquí, en la próxima hora:
Por supuesto, sustituya "doRefresh" con el método deseado de su clase
intente crear el objeto de calendario una vez y haga que allUnits sea estático para mayor eficiencia.
agregar un componente de una hora funciona bien, no es necesario realizar una prueba de medianoche ( enlace )
fuente