2012-09-04 13 views
6

Si tengo una gran descarga de archivos y la aplicación se mueve a un segundo plano, ¿hay alguna forma de mantener activa la descarga de las funciones?iOS: finalización de una tarea al ingresar el fondo

Sé que beginBackgroundTaskWithExpirationHandler: se llama cuando la aplicación se mueve a un segundo plano y puedo comenzar mi tarea allí, pero no quiero comenzar una nueva tarea, quiero completar mi tarea anterior. Se puede resolver con beginBackgroundTaskWithExpirationHandler:, pero para eso necesito detener mi descarga y reanudarla desde el lugar correcto, lo cual es simplemente una tontería.

Idealmente, lo que quiero es que ajuste mi función de descarga con un controlador de caducidad, por lo que mi función de descarga se sigue ejecutando durante el tiempo permitido después de que la aplicación se haya movido al fondo.

+1

http://stackoverflow.com/questions/9136890/how-should-beginbackgroundtaskwithexpirationhandler-be-dealt-with-for-an-nsurlc/9137656#9137656 – user523234

+0

Gracias, supongo que es un poco más de trabajo en ese momento. – SMK

Respuesta

6

Lo ideal sería que lo que quiero es que me envuelvo mi función de descarga a un controlador de caducidad, por lo que mi función de descarga mantiene ejecutor del tiempo permitido después de la aplicación se ha desplazado a un segundo plano.

Así es exactamente como funciona. beginBackgroundTaskWithExpirationHandler: no se llama cuando ingresa el fondo. Es lo que usted llama para indicar que está iniciando algo que, si pasa a un segundo plano mientras se está ejecutando, le gustaría terminar. Simplemente envuelva su código de descarga existente con beginBackgroundTaskWithExpirationHandler: y endBackgroundTask:.

+0

Tienes razón, ¡debería haber leído la documentación mejor! – SMK

-3

Está perfectamente bien iniciar un hilo de fondo cuando estás en el forground. Agregue su controlador de caducidad personalizado. Haz una solicitud asincrónica.

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 
             (unsigned long)NULL), ^(void) { 
    [self performYourStuffInTheBackGround]; 
}); 

Y una cita de AppleDEV;

es probable que desee utilizar las API de red asíncrona. iOS proporciona una amplia variedad de API para hacer esto, desde API de bajo nivel como GCD hasta API de alto nivel como NSURLConnection, con muchas paradas intermedias, y le recomendamos que las use.