NSURLConnection sendAsynchronousRequest: queue: completionHandler: hacer múltiples solicitudes en una fila?

He estado usando el NSURLConnection's sendAsynchronousRequest:queue:completionHandler: NSURLConnection's sendAsynchronousRequest:queue:completionHandler: , que es genial. Pero ahora necesito hacer varias solicitudes seguidas.

¿Cómo puedo hacer esto mientras uso este gran método asicrónico?

Hay muchas maneras de hacerlo, dependiendo del comportamiento que desee.

Puede enviar un montón de solicitudes asíncronas a la vez, realizar un seguimiento de la cantidad de solicitudes que se han completado y hacer algo una vez que hayan terminado:

 NSInteger outstandingRequests = [requestsArray count]; for (NSURLRequest *request in requestsArray) { [NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse *response, NSData *data, NSError *error) { [self doSomethingWithData:data]; outstandingRequests--; if (outstandingRequests == 0) { [self doSomethingElse]; } }]; } 

Puedes encadenar los bloques:

 NSMutableArray *dataArray = [NSMutableArray array]; __block (^handler)(NSURLResponse *response, NSData *data, NSError *error); NSInteger currentRequestIndex = 0; handler = ^{ [dataArray addObject:data]; currentRequestIndex++; if (currentRequestIndex < [requestsArray count]) { [NSURLConnection sendAsynchronousRequest:[requestsArray objectAtIndex:currentRequestIndex] queue:[NSOperationQueue mainQueue] completionHandler:handler]; } else { [self doSomethingElse]; } }; [NSURLConnection sendAsynchronousRequest:[requestsArray objectAtIndex:0] queue:[NSOperationQueue mainQueue] completionHandler:handler]; 

O puede hacer todas las solicitudes de forma sincrónica en un bloque ansincrónico:

 dispatch_queue_t callerQueue = dispatch_get_current_queue(); dispatch_queue_t downloadQueue = dispatch_queue_create("Lots of requests", NULL); dispatch_async(downloadQueue, ^{ for (NSRURLRequest *request in requestsArray) { [dataArray addObject:[NSURLConnection sendSynchronousRequest:request returningResponse:nil error:nil]]; } dispatch_async(callerQueue, ^{ [self doSomethingWithDataArray:dataArray]; }); }); }); 

PD. Si usa alguno de estos, debería agregar alguna comprobación de errores.