2012-06-04 23 views
6

Tengo una aplicación de reproductor multimedia que reproduce música con MPMoviePlayerController. Necesito actualizar la UI según la posición de reproducción. Lo mejor que puedo decir es que no hay forma de recibir activamente esta información del jugador con una devolución de llamada o algo así, y básicamente necesito sondearlo yo mismo.¿Cómo monitorear el progreso de reproducción de MPMoviePlayerController sin matar una batería?

Así que pensé en usar un temporizador simple, ejecutar cada segundo, para eso. El código es tal:

En alguna parte del código de configuración:

[NSTimer scheduledTimerWithTimeInterval:1 target:self selector:@selector(updatePlaybackProgressFromTimer:) userInfo:nil repeats:YES]; 

Y luego:

- (void) updatePlaybackProgressFromTimer:(NSTimer *)timer { 

    if (([UIApplication sharedApplication].applicationState == UIApplicationStateActive) && (player.playbackState == MPMoviePlaybackStatePlaying)) { 

     CGFloat progress = player.currentPlaybackTime/player.duration; 
     // do something useful with this info    
    } 

}

El temporizador se ejecuta cada segundo, incluso cuando la aplicación está en el fondo. El método primero ve si la aplicación está activa y el reproductor está jugando, y luego realiza alguna actualización de UI.

¿Hay alguna implicancia en la duración de la batería para ejecutar un temporizador cada segundo de esta manera? ¿Debo ser más diligente y tratar de demoler el temporizador al ingresar al fondo y reactivarlo al activar la aplicación? Estoy seguro de que hay un cierto efecto de duración de la batería, pero de manera realista, ¿qué tan serio es? ¿O hay otras formas recomendadas de hacer este tipo de cosas?

+1

sólo tiene que utilizar un temporizador según lo sugerido por @ChrisGummer. No hay KVO para el marco MPMoviePlayerController o devoluciones de llamada similares. Sin embargo, AVFoundation (AVPlayer) ya lo tiene; no obstante, no es necesario abstenerse de un temporizador por las razones dadas. – Till

Respuesta

7

No me imagino que usar un NSTimer impactará significativamente la duración de la batería, a menos que el trabajo que se realiza cuando se active tenga un impacto en la duración de la batería. El temporizador simplemente se está agregando al bucle de ejecución actual:

Un temporizador no es un mecanismo en tiempo real; se dispara solo cuando se ejecuta uno de los modos de ciclo de ejecución al que se ha agregado el temporizador y puede comprobar si ha pasado el tiempo de activación del temporizador.

NSTimer Class Reference

De acuerdo con la documentación, se debe hacer una pausa alguna temporizadores cuando su aplicación está a punto de renunciar a su estado activo:

En respuesta a este cambio, su aplicación debe hacer el siguiente en su applicationWillResignActive: método:

  • parada temporizadores y otras tareas periódicas.
  • Detenga las consultas de metadatos en ejecución.
  • No inicie ninguna tarea nueva.
  • Pausa la reproducción de la película (excepto cuando se reproduce con AirPlay).
  • Entre en estado de pausa si su aplicación es un juego.
  • Reduzca la velocidad de cuadros de OpenGL ES.
  • Suspenda las colas de distribución o las colas de operación que ejecutan código no crítico. (Puede seguir procesando las solicitudes de red y otras tareas en segundo plano mientras está inactivo.)

Cuando su aplicación se mueve de nuevo al estado activo, su applicationDidBecomeActive: método debe anular las medidas tomadas en el applicationWillResignActive: método. Por lo tanto, después de la reactivación , su aplicación debe reiniciar los temporizadores, reanudar el envío de las colas , y acelerar las tasas de cuadros de OpenGL ES nuevamente. Sin embargo, los juegos no deben reanudarse automáticamente; deben permanecer en pausa hasta que el usuario elija reanudarlos.

iOS App Programming Guide

+0

+1 respuesta completamente correcta y bien referenciada – Till

Cuestiones relacionadas