2012-02-23 23 views

Trả lời

107

Có nhiều cách để bạn có thể thực hiện việc này tùy thuộc vào hành vi bạn muốn.

Bạn có thể gửi một loạt các yêu cầu không đồng bộ cùng một lúc, theo dõi số lượng yêu cầu đã được hoàn thành, và làm điều gì đó một lần tất cả họ đang thực hiện:

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

Bạn có thể chuỗi các khối với nhau:

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

Hoặc bạn có thể làm tất cả những yêu cầu đồng bộ trong một khối 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. Nếu bạn sử dụng bất kỳ trong số này, bạn nên thêm một số kiểm tra lỗi.

+0

Không gửi yêu cầu đồng bộ trong một rò rỉ bộ nhớ do dispatch_asycn gây ra? –

+0

Rò rỉ bộ nhớ? Tại sao? – yuji

+0

Tôi đoán tôi đã bị ấn tượng rằng yêu cầu đồng bộ trong một chủ đề nền là xấu. Nhưng việc sử dụng dispatch_async không thực sự là một chủ đề nền? –

Các vấn đề liên quan