2009-11-05 6 views
6

Quiero mostrar el tiempo (incluidos los segundos) en una aplicación en un campo de texto, bastante simple. Lo que hago actualmente es crear un NSTimer que se ejecute cada 0.1 segundos que obtiene la hora del sistema y actualiza el campo de texto. Esto parece una forma terriblemente ineficiente de lograr esto. ¿Hay una mejor manera?¿Cómo mostrar el tiempo en segundos en Cocoa de manera eficiente?

Respuesta

6

¿Lo muestra con resolución de décimo de segundo (o más fino)?

Si es así, no veo ningún problema. Por lo general, la votación es una mierda porque lo que está comprobando podría no haber cambiado, pero no es hora de que el tiempo se detenga en usted. Entonces, un temporizador de décimo de segundo está bien.

De lo contrario, cree un temporizador cuyo intervalo sea la resolución deseada, luego obtenga su fecha de disparo, redondee a la resolución deseada (por ejemplo, un segundo si actualiza cada segundo) y configúrelo como el nuevo incendio fecha. Entonces, su temporizador solo se activará coincidentemente con las veces que sea apropiado actualizar la vista del reloj.

Tenga en cuenta que aunque el tiempo siempre se mueve, no siempre se mueve linealmente: puede saltar adelante o atrás una hora o media, o cualquier cantidad si el usuario (o ntpd) cambia la configuración del reloj del sistema. En Mac OS X 10.6 y posterior, puede observar el NSSystemClockDidChangeNotification y reajustar la fecha de encendido de su temporizador cuando eso sucede.

+0

Solo estoy mostrando una resolución de un segundo. Pero si sondeo en un segundo podría estar, por ejemplo, .9 segundos tarde en la actualización de mi texto. Si un usuario tiene la opción "Mostrar segundos" configurada en su reloj en la barra de menú, quiero que la aplicación parezca actualizar el texto del tiempo en el momento exacto en que la barra de menús cambia en segundos, sondeando 10 veces por segundo. – rscott

+0

No tendrá 0,9 segundos de retraso si ha configurado la fecha del incendio correctamente. El temporizador tendría que demorarse bastante para sacarlo, y si está rezagado en 0.9 segundos, establecer su intervalo a 0.1 segundos no va a ayudar. –

0

No estoy seguro de qué otra cosa sería más eficiente. Siempre que la devolución de llamada de su temporizador no haga nada demasiado intenso, es probable que esté cerca de lo óptimo.

-2

¿Qué le parece usar gettimeofday(2)? Devuelve mucha información de tiempo exacta para usar.

+1

Eso no mantiene la pantalla actualizada, sin embargo. Obtener la hora actual no es la parte difícil; es la actualización periódica de la que el que pregunta se estaba preguntando. Además, su afirmación de que 'gettimeofday'" devuelve mucha [más] información de tiempo exacta "carece de una comparación: ¿más exacto que qué? –

2

¿Qué tal si usas NSTimer que se ejecuta cada segundo y luego verificas el tiempo de encendido y te aseguras de que sea exactamente al inicio de un segundo. Puede utilizar initWithFireDate:interval:target:selector:userInfo:repeats: o establezca la próxima vez invocación apropiada usando setFireDate: después de que el temporizador se creó:

NSTimeInterval interval = [[timer fireDate] timeIntervalSinceReferenceDate]; 
NSTimeInterval nextFire = ceil(interval); 
[timer setFireDate: [NSDate dateWithTimeIntervalSinceReferenceDate: nextFire]; 

entonces usted estará seguro de que se activa el temporizador tan cerca del tiempo que se necesita como sea posible y no se preocupan de el temporizador queda rezagado porque se reinicia después de cada disparo utilizando la fecha de disparo prevista y el intervalo que proporcionó, por lo que siempre intentará disparar en el segundo exacto (pero se disparará siempre que el ciclo de ejecución sea capaz de hacerlo).

Cuestiones relacionadas