NSURLConnection sendAsynchronousRequest: queue: completionHandler: выполнение нескольких запросов подряд?
Я использую NSURLConnection's
sendAsynchronousRequest:queue:completionHandler:
метод, который является большим. Но, теперь мне нужно сделать несколько запросов подряд.
Как я могу сделать это, все еще используя этот великий асинхронный метод?
1 ответ:
есть много способов вы можете сделать это в зависимости от поведения вы хотите.
вы можете отправить кучу асинхронных запросов сразу, отслеживать количество запросов, которые были завершены, и сделать что-то, как только они все будут сделаны:
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. Если вы используете любой из них, вы должны добавить некоторые ошибки проверочный.