Agregue un temporizador de visualización de conteo en ejecución a una aplicación iOS, como el cronómetro del reloj?

Estoy trabajando con una aplicación que procesa eventos de movimiento del dispositivo y actualiza la interfaz en incrementos de 5 segundos. Me gustaría agregar un indicador a la aplicación que muestre el tiempo total que la aplicación ha estado funcionando. Parece que un contador tipo cronómetro, como la aplicación nativa iOS Clock, es una forma razonable de contar el tiempo que la aplicación ha estado funcionando y mostrarlo al usuario.

De lo que no estoy seguro es de la implementación técnica de dicho cronómetro. Esto es lo que estoy pensando:

  • si sé por cuánto tiempo entre las actualizaciones de la interfaz, puedo sumr segundos entre eventos y mantener una cuenta de segundos como una variable local. Alternativamente, un temporizador progtwigdo por intervalos de 0,5 segundos puede proporcionar el conteo.

  • Si conozco la fecha de inicio de la aplicación, puedo convertir la variable local a la fecha para cada actualización de interfaz usando [[NSDate dateWithTimeInterval:(NSTimeInterval) sinceDate:(NSDate *)]

  • Puedo usar un NSDateFormatter con un estilo de tiempo corto para convertir la fecha actualizada en una cadena usando el método stringFromDate

  • La cadena resultante se puede asignar a una etiqueta en la interfaz.

  • El resultado es que el cronómetro se actualiza para cada “marca” de la aplicación.

Me parece que esta implementación es demasiado pesada y no es tan fluida como la aplicación de cronómetro. ¿Hay una forma mejor y más interactiva de contar el tiempo que la aplicación ha estado funcionando? Tal vez hay algo que ya proporciona iOS para este propósito?

Casi lo que @terry lewis sugirió pero con un algoritmo de ajuste:

1) progtwigr un temporizador

 NSTimer *timer = [NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(timerTick:) userInfo:nil repeats:YES]; 

2) cuando el temporizador se dispara, obtén la hora actual (ese es el ajuste, no cuentes los tics porque si hay tambaleo en el temporizador, tick contar acumulará el error), luego actualiza la UI. Además, NSDateFormatter es una forma más simple y versátil de formatear el tiempo para la visualización.

 - (void)timerTick:(NSTimer *)timer { NSDate *now = [NSDate date]; static NSDateFormatter *dateFormatter; if (!dateFormatter) { dateFormatter = [[NSDateFormatter alloc] init]; dateFormatter.dateFormat = @"h:mm:ss a"; // very simple format "8:47:22 AM" } self.myTimerLabel.text = [dateFormatter stringFromDate:now]; } 

Si observa el código de ejemplo de iAd de Apple en el proyecto de banner básico, tiene un temporizador simple:

 NSTimer *_timer; _timer = [NSTimer scheduledTimerWithTimeInterval:0.1 target:self selector:@selector(timerTick:) userInfo:nil repeats:YES]; 

y el método que tienen

 - (void)timerTick:(NSTimer *)timer { // Timers are not guaranteed to tick at the nominal rate specified, so this isn't technically accurate. // However, this is just an example to demonstrate how to stop some ongoing activity, so we can live with that inaccuracy. _ticks += 0.1; double seconds = fmod(_ticks, 60.0); double minutes = fmod(trunc(_ticks / 60.0), 60.0); double hours = trunc(_ticks / 3600.0); self.timerLabel.text = [NSString stringWithFormat:@"%02.0f:%02.0f:%04.1f", hours, minutes, seconds]; } 

Simplemente se ejecuta desde el inicio, bastante básico.