2012-06-19 12 views
13

Estoy creando una aplicación en la que estoy descargando algunos datos del servidor. Mientras estoy en segundo plano, quiero que la conexión continúe ejecutándose para que se puedan descargar los datos. Sé que no hay método en el AppDelegateContinuar descarga en el fondo

- (void)applicationDidEnterBackground:(UIApplication *)application 

que se llama cuando la aplicación entra en el fondo. Pero a medida que se crea la conexión en viewController, ¿cómo se puede gestionar en appDelegate?
También hay/hay otras formas de hacerlo? He pasado por el enlace this pero ¿hay algo simple de implementar?

+0

que es la forma oficial de hacerlo, thre hay otras maneras tanto como yo sé –

+0

usted debe comprobar este enlace http://stackoverflow.com/questions/4579810/ios-application-background-downloading – swiftBoy

Respuesta

14

Una forma de hacer algunas operaciones que continúan en segundo plano es crear una secuencia separada para realizar la descarga. Dentro del hilo, corchetee sus operaciones de descarga entre llamadas a beginBackgroundTaskWithExpirationHandler: y endBackgroundTask. No necesita verificar si se está ejecutando en segundo plano o no, siempre llama a estos dos métodos.

// Tell iOS this as a background task in case we get backgrounded 
UIBackgroundTaskIdentifier taskId = [[UIApplication sharedApplication] 
      beginBackgroundTaskWithExpirationHandler:NULL]; 

//---------------------------------------------- 
// Perform your download operations here 
//---------------------------------------------- 
ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url]; 

// Tell iOS that we are done with stuff that needed to keep going even if backgrounded  
[[UIApplication sharedApplication] endBackgroundTask:taskId]; 
+1

Puede establecer la propiedad ASIHttpRequest: [request setShouldContinueWhenAppEntersBackground: YES]; – HelloWorld

+0

¡Muchas gracias! Corrígeme si me equivoco: para concluir, casi no hay diferencia entre ejecutar la tarea en segundo plano o en primer plano. Ambos se ejecutarían con este código. Sin embargo, vienen a mi mente 2 diferencias: 1.** si ** tu tarea de fondo es demasiado larga, ¡entonces tal vez terminarías antes de terminarla! 2. Es mejor 'endBackgroundTask: taskId' para que ahorre batería extra. – Honey

4

[edit] Lo siento, fui incorrecto, como se señaló en los comentarios, puede ampliar el límite de tiempo que tiene para realizar operaciones una vez/antes de que su aplicación entre en el fondo. Aquí está Apple's Official Documentation

+0

Esto no es cierto, puede ejecutar una [tarea de longitud definida] (http://developer.apple.com/library/ios/#DOCUMENTATION/iPhone/Conceptual/iPhoneOSProgrammingGuide/ManagingYourApplicationsFlow/ManagingYourApplicationsFlow.html#//apple_ref/ doc/uid/TP40007072-CH4-SW28) en el fondo durante un máximo de 10 min. – rckoenes

+0

@rckoenes usted es de hecho correcto, mis disculpas. Editaré mi respuesta. Gracias por la información :) – bennythemink

+0

Todavía no es cierto, puede llamar a ['beginBackgroundTaskWithExpirationHandler:'] (http://developer.apple.com/library/ios/#DOCUMENTATION/UIKit/Reference/UIApplication_Class/Reference/Reference.html# // apple_ref/occ/instm/UIApplication/beginBackgroundTaskWithExpirationHandler :) antes de ejecutar la tarea de longitud finita. No necesita realizar las operaciones una vez que se ejecuta en segundo plano. Puede comenzar la tarea antes de que su aplicación sea empujada al fondo. – rckoenes

1

No sé cómo maneja la descarga de datos exactamente. Pero puedes echar un vistazo al ASIHTTPRequest. Es muy simple y sencillo, y funciona con ARC si establece los indicadores del compilador en -fno-objc-arc. Con esto solo tienes que usar

ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url]; 
[request setShouldContinueWhenAppEntersBackground:YES]; //For iOS 4.0 and up 

Y eso funciona.

Here se puede ver cómo funciona ASIHTTPRequest

espero que ayude!

+0

ASIHTTPRequest ya no se desarrolla activamente ... según el mensaje [aquí] (http://allseeing-i.com/ASIHTTPRequest/). Solo digo. – zero0cool

+0

Cierto, pero todavía funciona como un encanto. No he encontrado ninguna buena alternativa con tanta funcionalidad como ASIHTTPRequest. – Thermometer