2012-02-23 11 views

Odpowiedz

107

Istnieje wiele sposobów na zrobienie tego w zależności od pożądanego zachowania.

Można wysłać kilka asynchronicznych żądań naraz, śledzić liczbę wniosków, które zostały zakończone, i zrobić coś raz oni wszystko zrobić:

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]; 
     } 
    }]; 
} 

Mogłabyś łańcuchowe bloki razem:

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]; 

Albo można zrobić wszystkie żądania synchronicznie w ansynchronous bloku:

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. Jeśli użyjesz któregokolwiek z nich, powinieneś dodać pewne sprawdzanie błędów.

+0

Czy wysyłanie żądania synchronicznego w dispatch_asycn nie powoduje przecieków pamięci? –

+0

Nieszczelności pamięci? Czemu? – yuji

+0

Sądzę, że miałem wrażenie, że synchroniczne żądanie w wątku tła było złe. Ale używanie dispatch_async nie jest tak naprawdę wątkiem tła? –

Powiązane problemy