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
¿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.
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.
¿Qué le parece usar gettimeofday(2)
? Devuelve mucha información de tiempo exacta para usar.
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é? –
¿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).
- 1. Manera eficiente de convertir segundos a minutos y segundos en el servidor sql 2005
- 2. NSTimer Reducir el tiempo en segundos/milisegundos
- 3. Calcular diferencia de tiempo en Cocoa
- 4. diferencia de tiempo en segundos
- 5. ¿Cómo calcular el tiempo transcurrido en segundos en VBA?
- 6. formato intervalo de tiempo para mostrar horas, minutos, segundos
- 7. ¿Hay alguna manera de determinar dinámicamente los ivars de una clase en tiempo de ejecución en Cocoa/Cocoa Touch?
- 8. Cómo borrar elemento duplicado en el vector, de manera eficiente
- 9. Manera eficiente de almacenar imágenes en android
- 10. Convertir tiempo a segundos en PostgreSQL
- 11. Tiempo en segundos para el formato de cadena personalizada
- 12. Cómo dividir archivos grandes de manera eficiente
- 13. ¿Cómo puedo mostrar el tiempo de consulta en Perl, DBI?
- 14. función para convertir el tiempo en número de segundos
- 15. Ruby: convertir el tiempo a segundos?
- 16. ¿Cómo implementaría estas consultas de manera eficiente en MongoDB?
- 17. Convirtiendo el tiempo 121.419419 en minutos/segundos legibles
- 18. convertir el tiempo de epoch a NSDate en cocoa/iPhone
- 19. Manera eficiente de dibujar en OpenGL ES
- 20. Cómo cargar texturas en OpenGL ES de manera eficiente
- 21. ¿Cómo puedo formatear los intervalos de tiempo en Cocoa?
- 22. Cómo crear y mostrar una hoja personalizada en Cocoa?
- 23. cómo mostrar solo el tiempo en el oráculo?
- 24. Tiempo de modificación del archivo (segundos) en Unix
- 25. Cómo mostrar el formato de hora sensible al contexto sin segundos en python
- 26. Cómo pintar imágenes SVG de manera eficiente en Java?
- 27. mostrar datos después de cada 10 segundos en Android
- 28. Obtenga tiempo POSIX/Unix en segundos y nanosegundos en Python?
- 29. Cómo eliminar documentos por consulta de manera eficiente en mongo?
- 30. FFmpeg: ¿Cómo dividir el video de manera eficiente?
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
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. –