AFNetworking verifique el progreso de descarga para todas las operacionesqueue

Tengo una aplicación de iOS creada con AFNetworking. Tengo una subclass personalizada singclean httpclient y la uso para consumir mi API y download files binarys del server.

Necesito download cerca de 100 files. ¿Es seguro para iterar a través de mi matriz de url y crear una AFHTTPRequestionOperation para cada url? Mi código es el siguiente:

NSMutableURLRequest* rq = [[MIHTTPClient shanetworkingInstance] requestWithMethod:@"GET" path:@"...." parameters:nil]; AFHTTPRequestOperation *operation = [[AFHTTPRequestOperation alloc] initWithRequest:rq] ; operation.outputStream = [NSOutputStream outputStreamToFileAtPath:path append:NO]; [operation setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject) { //completion } failure:^(AFHTTPRequestOperation *operation, NSError *error) { //manage error }]; [[MIHTTPClient shanetworkingInstance] enqueueHTTPRequestOperation:operation]; 

¿Cómo puedo recibir comentarios de esta queue? No veo ningún protocolo "HTTPClientDelegate" o algo así.

Gracias

Con respecto al progreso, vea setDownloadProgressBlock (parte de AFURLConnectionOperation , de la cual AFHTTPRequestOperation está subclasificada), por ejemplo:

 [operation setDownloadProgressBlock:^(NSInteger bytesWritten, NSInteger totalBytesWritten, NSInteger totalBytesExpectedToWrite) { NSLog(@"Sent %d of %d bytes, %@", totalBytesWritten, totalBytesExpectedToWrite, path); }]; 

Y, en su ejemplo de código, está llamando a setCompletionBlockWithSuccess:failure: por lo que proporciona el estado con respecto a la finalización de las operaciones individuales. Personalmente, en mi pequeña testing, simplemente mantengo una variedad de mis descargas solicitadas, y tengo estos tres bloques (progreso, éxito y falla) que actualizan el código de estado de mis descargas así:

 for (NSInteger i = 0; i < 20; i++) { NSURLRequest *request = ... // set the request accordingly // create a download object to keep track of the status of my download DownloadObject *object = [[DownloadObject alloc] init]; download.title = [NSString stringWithFormat:@"Download %d", i]; download.status = kDownloadObjectStatusNotStarted; [self.downloadObjects addObject:download]; AFHTTPRequestOperation *operation = [[AFHTTPRequestOperation alloc] initWithRequest:request]; [operation setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject) { download.status = kDownloadObjectStatusDoneSucceeded; // update my UI, for example, I have table view with one row per download // // [self.tableView reloadRowsAtIndexPaths:@[[NSIndexPath indexPathForRow:i inSection:0]] // withRowAnimation:UITableViewRowAnimationNone]; } failure:^(AFHTTPRequestOperation *operation, NSError *error) { download.status = kDownloadObjectStatusDoneFailed; // update UI // // [self.tableView reloadRowsAtIndexPaths:@[[NSIndexPath indexPathForRow:i inSection:0]] // withRowAnimation:UITableViewRowAnimationNone]; }]; [operation setDownloadProgressBlock:^(NSUInteger bytesRead, long long totalBytesRead, long long totalBytesExpectedToRead) { download.totalBytesRead = totalBytesRead; download.status = kDownloadObjectStatusInProgress; // update UI // // [self.tableView reloadRowsAtIndexPaths:@[[NSIndexPath indexPathForRow:i inSection:0]] // withRowAnimation:UITableViewRowAnimationNone]; }]; [queue addOperation:operation]; } 

Puede realizar un seguimiento de las descargas individuales de esta manera. También puede realizar un seguimiento de las operaciones pendientes (o consultar la propiedad operationQueue del object HTTPClient y ver la propiedad operationCount de eso).


En términos de descarga de 100 files, dos consideraciones:

  • Hubiera pensado que querrías llamar a setMaxConcurrentOperationCount en el operationQueue de tu subclass HTTPClient , configurándolo a un número razonable (4 o 5), como mirando el código AFNetworking, parece que no lo hace. Me parece que hay performances decrecientes si va mucho más allá de eso, y si todos los files son de un solo server, existen restricciones sobre cuántas operaciones concurrentes se pueden hacer entre un cliente dado y un server determinado.

  • He leído afirmaciones anecdóticas de que Apple rechazará las aplicaciones que hacen pedidos extraordinarios a través de la networking celular. Consulte https://stackoverflow.com/a/14922807/1271826 .