Я сделал что-то подобное раньше. Я использовал пользовательский объект, который содержал экземпляр NSURLRequest
и стиль NSURLConnection completionHandler
. Эти объекты были созданы и добавлены в очередь.
Вспомогательный метод отменяет запрос и отправляет его. В исходном завершении Handler NSURLConnection я вызвал завершение Handler для настраиваемого объекта, а затем снова вызвал вспомогательный метод. Затем будет отменен следующий запрос.
В коде, который будет выглядеть следующим образом:
@interface URLRequest: NSObject
@property (strong, nonatomic) NSURLRequest *request;
@property (copy, nonatomic) void (^completionHandler)(NSURLResponse *response, NSData *data, NSError *connectionError);
@end
@implementation URLRequest
@end
// viewController Interface
@property (strong) NSMutableArray *requestsQueue;
// implementation
- (BOOL)sendURLRequest {
if ([self.requestsQueue count] > 0) {
URLRequest *request = self.requestsQueue[0];
[NSURLConnection sendAsynchronousRequest:request.request queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError) {
NSLog(@"Request to url %@ done", response.URL);
if (request.completionHandler) {
request.completionHandler(response, data, connectionError);
}
[self.requestsQueue removeObjectAtIndex:0];
if (![self sendURLRequest]) {
NSLog(@"Queue Completed");
}
}];
return YES;
}
else {
NSLog(@"All requests send");
return NO;
}
}
- (void)addRequestToQueue:(URLRequest *)request {
if (!self.requestsQueue) {
self.requestsQueue = [NSMutableArray array];
}
BOOL queueWasEmpty = [self.requestsQueue count] == 0;
[self.requestsQueue addObject:request];
if (queueWasEmpty) {
NSLog(@"Start request queue");
[self sendURLRequest];
}
}
URLRequest *request = [[URLRequest alloc] init];
request.request = [NSURLRequest requestWithURL:[NSURL URLWithString:@"http://www.google.com"]];
request.completionHandler = ^(NSURLResponse *response, NSData *data, NSError *connectionError) {
NSLog(@"Request to www.google.com completed with status %ld", (long)((NSHTTPURLResponse *)response).statusCode);
};
[self addRequestToQueue:request];
request = [[URLRequest alloc] init];
request.request = [NSURLRequest requestWithURL:[NSURL URLWithString:@"http://www.stackoverflow.com"]];
request.completionHandler = ^(NSURLResponse *response, NSData *data, NSError *connectionError) {
NSLog(@"Request to www.stackoverflow.com completed with status %ld", (long)((NSHTTPURLResponse *)response).statusCode);
};
[self addRequestToQueue:request];
Это наивная версия. Вы должны думать об ошибке (и тайм-ауте) самостоятельно.
К сожалению, как это сделать с более чем одним 'dispatch_async' И что окончательное завершение? – riyaz