2012-02-23 8 views

risposta

107

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.

+0

La mancata invocazione di una richiesta sincrona in un dispatch_asycn causa perdite di memoria? –

+0

Perdite di memoria? Perché? – yuji

+0

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? –

Problemi correlati