2011-12-07 15 views
5

Estoy usando este código para recorrer una matriz para descargar varios archivos y escribir en el disco.AFnetworking descarga de varios archivos

-(void)download 
{ 
//set url paths 
for (NSString *filename in syncArray) 
{ 
    NSString *urlpath = [NSString stringWithFormat:@"http://foo.bar/photos/%@", filename]; 
    NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:urlpath]]; 
    AFHTTPRequestOperation *operation = [[AFHTTPRequestOperation alloc] initWithRequest:request]; 
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
NSString *path = [[paths objectAtIndex:0] stringByAppendingPathComponent:filename]; 
operation.outputStream = [NSOutputStream outputStreamToFileAtPath:path append:NO]; 

[operation setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject) { 
    NSLog(@"Successfully downloaded file to %@", path); 
} failure:^(AFHTTPRequestOperation *operation, NSError *error) { 
    NSLog(@"Error: %@", error); 
}]; 


[operation start]; 

pero el problema es que llama el bloque de éxito después de cada archivo se hace, (que debería), pero sólo necesito una última llamada de vuelta para recargar algunos datos y finalizar un progreso HUD.

Cualquier apunta en la dirección correcta sería genial.

+0

Oye, ¿A dónde llama esta función? En AppDelegate o en un controlador en particular? Además, ¿qué sucede si la aplicación se cierra antes de que termine la descarga? Gracias – manishKungwani

Respuesta

5

Tal vez algún día esto ayude a alguien, pero pude utilizar una solución alternativa que probablemente tiene problemas importantes, pero está bien para mi uso simple.

Acabo de eliminar cada línea de la matriz de sincronización después de que se procesó y luego ejecuté el código que necesitaba.

[operation setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject) { 
    NSLog(@"Successfully downloaded file to %@", path); 
    [SVProgressHUD showWithStatus:@"Updating Photos"]; 
    [syncArray removeObject:filename]; 
    if (!syncArray || !syncArray.count) 
    { 
    NSLog(@"array empty"); 
     [[NSNotificationCenter defaultCenter] postNotificationName:@"TestNotification" object:self]; 
     [SVProgressHUD dismissWithSuccess:@"Photos Updated"]; 
    } 
5

Puede utilizar AFHTTPClient a enqueueBatchOperations y esto tiene un completionBlock que se llama cuando se acaban todas las operaciones. Debería ser exactamente lo que estás buscando.

+0

Estoy de acuerdo, esta es una mejor solución. – ajmccall

+1

La página de enlace no está disponible ahora ...... –