NSURLConnection sendAsynchronousRequest: queue: завершениеHandler: делать несколько запросов подряд? - PullRequest
53 голосов
/ 23 февраля 2012

Я использовал NSURLConnection's sendAsynchronousRequest:queue:completionHandler: метод, который великолепен. Но теперь мне нужно сделать несколько запросов подряд.

Как я могу сделать это, все еще используя этот отличный асинхронный метод?

1 Ответ

108 голосов
/ 23 февраля 2012

Существует множество способов сделать это в зависимости от желаемого поведения.

Вы можете отправлять сразу несколько асинхронных запросов, отслеживать количество выполненных запросов и что-то делать, когда онивсе сделано:

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

Или вы можете выполнить все запросы синхронно в асинхронном блоке:

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

PS Если вы используете какой-либо из них, вам следует добавить проверку ошибок.

...