2012-02-23 11 views

cevap

107

Bunu yapmak istediğiniz davranışa bağlı olarak yapabileceğiniz pek çok yol var.

hepsi bitmiş girince Sen kerede asenkron istekleri bir demet göndermek tamamlanmış isteklerinin sayısını izlemek ve bir şeyler yapabiliriz

:

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

Yapabilirsin birlikte zincir blokları:

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

Veya bir ansynchronous bloğunda eşzamanlı tüm istekleri yapabilirdi:

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. Bunlardan herhangi birini kullanırsanız, bazı hata denetimi eklemelisiniz.

+0

Bir dispatch_asycn dosyasında eşzamanlı bir istek göndermiyor mu, bellek sızıntılarına neden oluyor? –

+0

Bellek sızıyor mu? Niye ya? – yuji

+0

Sanırım arka plan iş parçacığında eşzamanlı istek kötüydü. Ama dispatch_async kullanmak gerçekten bir arka plan değil mi? –