2012-02-06 13 views
18

He estado buscando literalmente semanas para tratar de encontrar una respuesta, o un ejemplo de cómo hacer esto.¿Cómo se puede continuar en el fondo una conexión iniciada con NSURLConnection en primer plano?

Todos los ejemplos/tutoriales para NSURLConnection lo muestran comenzando en primer plano o comenzando en segundo plano, ídem todos los ejemplos de beginBackgrounTaskWithExpirationHandler: muestran cómo iniciar una tarea en segundo plano después de ingresar el fondo.

Por lo que puedo decir, no hay nada en internet o libros que muestre cómo iniciar una conexión mientras está en primer plano y luego, si no termina, continúe en segundo plano.

La respuesta a esta pregunta en realidad no responder a la pregunta:

How should beginbackgroundtaskwithexpirationhandler: be dealt with for an NSUrlConnection that is already in progress?

Si usted lee la referened allá de la sección Conceptos básicos que dice: "Si bien la aplicación está en primer plano la tarea de fondo ganó' Tiene algún efecto ". Esto significa que no es posible iniciar una tarea en segundo plano utilizando NSURLConnection mientras está en primer plano si desea descargarlo en primer plano.

+0

El documento dice que "mientras la aplicación está en primer plano la tarea de fondo no tiene ningún efecto, sin embargo , si el usuario mueve la aplicación al fondo, la existencia de la tarea de fondo mantendrá automáticamente la aplicación ejecutándose para que pueda completar la operación ". Esto tiene mucho sentido para mí como debería funcionar la tarea en segundo plano: una vez que inicias la tarea (por ejemplo, descarga un archivo) en primer plano, si la aplicación ingresa en segundo plano, terminará la tarea de descarga sin cortar la conexión de red . – sbs

Respuesta

38

Simplemente llame a beginBackgroundTaskWithExpirationHandler:mientras que su aplicación está en primer plano cuando comienza el proceso de descarga. Tenga en cuenta que usted tiene que almacenar el valor de retorno a una Ivar/propiedad:

@property (nonatomic, assign) UIBackgroundTaskIdentifier backgroundTaskID; 

@synthesize backgroundTaskID; 

... 

NSURLConnection *connection = [NSURLConnection connectionWithRequest:request delegate:self]; 
self.backgroundTaskID = [[UIApplication sharedApplication] beginBackgroundTaskWithExpirationHandler:^{ 
    // Cancel the connection 
    [connection cancel]; 
}]; 

Esto permitirá que su aplicación siga funcionando si se envía a un segundo plano, mientras que la descarga está en marcha. Luego, en sus métodos de delegado que indican la finalización de la descarga, usted tiene que colocar el juego endBackgroundTask::

- (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error { 
    // Handle the error 
    ... 

    [[UIApplication sharedApplication] endBackgroundTask:self.backgroundTaskID]; 
} 

- (void)connectionDidFinishLoading:(NSURLConnection *)connection { 
    // Save the downloaded data 
    ... 

    [[UIApplication sharedApplication] endBackgroundTask:self.backgroundTaskID]; 
} 
+0

acaba de probar este método, funciona como un encanto con NSURLConnection! ¡Gracias! – sbs

+0

Tenga en cuenta que hoy en día este método solo funciona durante 3 minutos en segundo plano desde iOS 7, ¿hay alguna forma de mantenerlo vivo? – CGR

Cuestiones relacionadas