2011-10-31 8 views
9

Mi aplicación carga un video en Facebook. Me gustaría completar la carga en segundo plano, incluso si un usuario impaciente hace clic en el botón Inicio durante la carga.iOS - Cómo completar un proceso largo en segundo plano

Después de leer un poco, he intentado esto:

 UIBackgroundTaskIdentifier bti = [[UIApplication sharedApplication] beginBackgroundTaskWithExpirationHandler:^{ 
     [[UIApplication sharedApplication] endBackgroundTask:bti]; 
    }]; 

    [fb requestWithGraphPath:@"me/videos" 
        andParams:params 
       andHttpMethod:@"POST" 
        andDelegate:self]; 

    [[UIApplication sharedApplication] endBackgroundTask:bti]; 

El trabajo se realiza con el método de la petición fb. El video se carga en Facebook a través de una conexión http. Esto funciona bien, pero si hace un fondo de la aplicación haciendo clic en el botón de Inicio mientras la carga está en progreso, la carga se suspende. Si pone en primer plano la aplicación, se reanuda la carga.

Lo que esperaba que sucediera es que la carga terminaría en segundo plano.

¿Alguna esperanza de conseguir que funcione? ¿Estoy haciendo algo mal con todo el asunto de beginBackgroundTask? Parece demasiado simple para trabajar de esa manera, pero eso es lo que parecen decir los documentos.

Cualquier ayuda, muy apreciada.

- John

+0

@jhon necesito subir videos en modo de fondo. ¿Puedo hacerlo demandando este bloque de código? ¿Existe alguna posibilidad de que Apple rechace mi aplicación, ya que ejecutar el proceso de larga ejecución en segundo plano tiene limitaciones? –

Respuesta

9

es necesario llamar a [[UIApplication sharedApplication] endBackgroundTask:bti]; en la devolución de llamada delegado. Deberá almacenar el bti en un ivar o como una variable estática.

+0

Gracias por ponerme en el camino correcto. Proporcioné una respuesta más detallada, para aquellos que podrían estar teniendo problemas con esto. – John

15

Bien, lo descubrí. Debe ejecutar el código 'comenzar' al comienzo de una tarea larga que desee completar en segundo plano, incluso después de que la aplicación finalice, y luego ejecutar el código 'final' cuando la tarea finalice.

Mi código anterior ejecuta el código 'final' demasiado pronto, por lo que finaliza la ejecución de fondo casi de inmediato.

La manera de hacerlo es hacer algo como:

// make sure save can complete in the background 
    if ([[UIDevice currentDevice] isMultitaskingSupported]) 
     backgroundTaskID = [[UIApplication sharedApplication] beginBackgroundTaskWithExpirationHandler:^{}]; 

cuando comienza la tarea de largo. Como hypercrypt, arriba, dice, 'backgroundTaskID debe ser un ivar o algo que pueda obtener más tarde, cuando se complete la tarea larga.

Cuando se completa la tarea, ejecutar algo como:

if ([[UIDevice currentDevice] isMultitaskingSupported]) { 
    [[UIApplication sharedApplication] endBackgroundTask:backgroundTaskID]; 
    backgroundTaskID = UIBackgroundTaskInvalid; 
} 

Funciona como un encanto.

+2

John - ¿Despega un hilo y pone todo esto en el hilo, o espera una señal del nuevo hilo y luego llama a endBackgroundTask en el hilo principal? – Chris

+1

@Chris Creo que sería una buena idea poner el proceso en un nuevo hilo. Si tiene que hacerlo en segundo plano, probablemente sea una tarea larga y compleja que debe realizarse en otro subproceso para evitar obstruir la interfaz de usuario. –

Cuestiones relacionadas