2011-01-02 14 views
7

¡Hola! Necesito saber cómo puedo hacer que mi aplicación para iOS inicie una descarga en segundo plano de la aplicación (por ejemplo, que la descarga se ejecute en el archivo AppDelegate), por lo tanto, el cambio de ViewControllers no interrumpirá ni cancelará la descarga. También necesito poder obtener el progreso de la descarga (0.00000 - 1.00000), para establecer un objeto UIProgressView, lo que también significa que necesito una función - (void)progressDidChangeTo:(int)progress.iOS Aplicación Descarga de fondo

Respuesta

18

Sólo tiene que utilizar ASIHTTPRequest que es la forma más fácil que NSURLRequest y hace exactamente lo que necesita. Es examples que muestra cómo descargar en segundo plano y cómo informar el progreso.

No descargaría nada en AppDelegate directamente. En cambio, crearía una clase separada solo para ese propósito. Llamémoslo MyService Inicializaría esa clase en el delegado de mi aplicación.

La clase puede funcionar como singleton o puede pasarse a cada controlador de vista que lo requiera.

En la clase MyService, agregaría ASINetworkQueue y algunos métodos para manejar las solicitudes cuando estén listas. Aquí está el código de ejemplos de ASI que puede usar:

- (IBAction)startBackgroundDownloading:(id)sender 
{ 
    if (!self.queue) { 
     self.queue = [[[ASINetworkQueue alloc] init] autorelease]; 
    } 

    NSURL *url = [NSURL URLWithString:@"http://allseeing-i.com"]; 
    ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url]; 
    [request setDelegate:self]; 
    [request setDidFinishSelector:@selector(requestDone:)]; 
    [request setDidFailSelector:@selector(requestWentWrong:)]; 
    [self.queue addOperation:request]; //queue is an NSOperationQueue 
    [self.queue go]; 
} 

- (void)requestDone:(ASIHTTPRequest *)request 
{ 
    NSString *response = [request responseString]; 
    //Do something useful with the content of that request. 
} 

- (void)requestWentWrong:(ASIHTTPRequest *)request 
{ 
    NSError *error = [request error]; 
} 

Si necesita establecer la barra de progreso. Me acaba de exponer el setDownloadProgressDelegate de ASINetworkQueue en mi clase MyService y la puso en mis ViewControllers así:

[[MyService service] setDownloadProgressDelegate: self.myUIProgressView]; 

cierto. Si necesita seguir descargando incluso cuando su aplicación se cierra, puede configurar ShouldContinueWhenAppEntersBackground la propiedad de su solicitud en SÍ.

+0

... Yo soy. Necesito que la descarga se realice en el archivo AppDelegate, de modo que la descarga no se detenga cuando comience el UIViewController que la inició. Necesito saber cómo puedo obtener un UIViewController para iniciar y acceder al objeto ASIHTTPRequest, pero tengo el objeto retenido en AppDelegate. –

+0

@hankweb, acabo de actualizar mi respuesta. –

+0

El problema es que se invocará reportFailure en ASIHTTPRequest.m cada vez que mi aplicación regrese del fondo. Uso el mismo método que sugirió en su publicación y el ShouldContineWhenAppEntersBackground establecido en SÍ. –

3

puede usar NSURLConnection para iniciar una solicitud asincrónica que no causará la congelación de su IU. Puede hacerlo haciendo algo como:

NSURLRequest *urlRequest = [[NSURLRequest alloc] initWithURL:url]; 
connection = [[NSURLConnection alloc] initWithRequest:urlRequest delegate:self]; 
[urlRequest release]; 

el fin de tener su progreso puede utilizar el:

connection:didReceiveResponse:(NSURLResponse *)response; 

llamada delegado para inspeccionar el response.expectedContentLength y luego usar el

connection:didReceiveData:(NSData *)data 

para rastrear la cantidad de datos que se descargaron y calcular un porcentaje.

Espero que esto ayude, Moszi

+0

Tengo la parte de descarga abajo, usando ASIHTTPRequest, solo necesito saber cómo implementar la descarga para comenzar en segundo plano, en lugar del UIViewController abierto actual, de modo que cuando el controlador de vista se descarta, la descarga continúa. –

+0

Puede crear una clase singleton para administrar su descarga, de esta manera esta clase estará disponible incluso si su controlador de vista está desasignado. (patrón singleton en wikipedia: http://en.wikipedia.org/wiki/Singleton_pattern) – Moszi

Cuestiones relacionadas