2010-11-28 18 views
7

Estoy usando NSURLConnection para descargar recursos de manera asincrónica en iOS. (Son archivos PDF de gran tamaño, por lo que tarda un tiempo en una conexión lenta).NSURLConnection y multitarea en iOS

Ahora estoy actualizando mi aplicación de iOS 3 a iOS 4. Como mi aplicación no tiene reconocimiento de ubicación, voip, y música de fondo, creo que necesito hacer algo.

Mi pregunta es, entonces, ¿qué ocurre con el NSURLConnection actualmente en ejecución? ¿Se suspende y se reanuda mágicamente cuando la aplicación vuelve al primer plano, o se mata por completo? Si es el último, ¿cuál es la estrategia estándar para reanudarlo automáticamente más tarde? ¿Existe una subclase de código abierto de NSURLConnection que automáticamente hace eso?

+0

insertas su investigación sobre este tema, será útil para mí y para los demás :) –

Respuesta

1

Puede iniciar una tarea que durará como mucho 10 minutos. Mire usando la API beginBackgroundTaskWithExpirationHandler: para este propósito. Solo ten en cuenta que si tu tarea lleva demasiado tiempo, será destruida por el sistema operativo.

+0

que en realidad no responder a la pregunta ... 'Mi pregunta es, entonces, ¿qué pasa con el NSURLConnection que se está ejecutando actualmente? ¿Se suspende y se reanuda mágicamente cuando la aplicación vuelve al primer plano, o se mata por completo? – gcamp

+0

En realidad lo hace. Hay solo 4 casos que sobreviven * CUALQUIER * código en segundo plano, y son los tres que mencionas, más este. Debe iniciar una tarea en segundo plano en algún momento antes de que su aplicación comience la transición de estados, para asegurarse de que la descarga continúe ejecutándose en segundo plano si el usuario sale. Si necesita cancelar la tarea, también hay una API para eso. – jer

+0

¿Qué sucede con el 'NSURLConnection' después de reanudar la aplicación? ¿Recibo 'connection: didFail ...:' delegate message? – Yuji

1

NSURLConnection se suspende y se inicia de nuevo cuando la aplicación entra en primer plano. Sólo asegúrese de que usted mata a la conexión si la aplicación se mueve de suspensión para no correr este modo:

- (void)applicationWillTerminate:(UIApplication *)application { 
    if (self.downloadConnection != nil){ 
     [self.downloadConnection cancel]; 
    } 
} 
+0

Uhm, ¿no se cancela automáticamente la conexión cuando finaliza la aplicación? – Yuji

+0

Sí, cuando finaliza la aplicación, la conexión se cancela, pero no cuando la aplicación entra en segundo plano. – marchinram

+0

Esto es inútil. 1. Las aplicaciones que usan multitareas (por lo que todas las aplicaciones de hoy en día) no usan el método applicationWillTerminate :. 2. Cuando se cierre la aplicación, ¿por qué tendrías que cancelar la solicitud si se cancela y se libera automáticamente cuando finaliza el ciclo de vida de la aplicación? 3. Tampoco se deben eliminar las NSURLConnections cuando la aplicación ingresa al fondo, por lo que el enfoque 'cancel' es incorrecto en todos los sentidos. – JonasG

Cuestiones relacionadas