2012-02-23 11 views

答えて

107

必要な動作によってこれを行う方法はたくさんあります。

あなたが完了した要求の数を追跡し、一度に非同期要求の束を送信し、それらがすべて終わったら、何かを行うことができます:

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

あなたが一緒にブロックをチェーンできます

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

それとも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.これらのいずれかを使用する場合は、エラーチェックを追加する必要があります。

+0

dispatch_asycnで同期要求をディスパッチしてもメモリリークが発生しませんか? –

+0

メモリリーク?どうして? – yuji

+0

私は、バックグラウンドスレッドの同期要求が悪いという印象を受けていたと思います。しかし、dispatch_asyncを使うのは実際にバックグラウンドスレッドではありませんか? –

関連する問題