Ci sono molti modi per farlo a seconda del comportamento che si desidera.
È possibile inviare un mucchio di richieste asincrone in una sola volta, tenere traccia del numero di richieste che sono state completate, e fare qualcosa una volta che sono tutti fatti:
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];
}
}];
}
Si potrebbe a catena i blocchi insieme:
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];
Oppure si potrebbe fare tutte le richieste in modo sincrono in un blocco di ansynchronous:
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];
});
});
});
P.S. Se si utilizza uno di questi si dovrebbe aggiungere un controllo degli errori.
La mancata invocazione di una richiesta sincrona in un dispatch_asycn causa perdite di memoria? –
Perdite di memoria? Perché? – yuji
Suppongo di avere l'impressione che la richiesta sincrona in un thread in background fosse negativa. Ma usare dispatch_async non è in realtà un thread in background? –