I did something similar before. I used a custom object that held a NSURLRequest
instance and a NSURLConnection style completionHandler
. These objects were created and added to a queue.
A helper method dequeues a request and sends it. In the original completionHandler of the NSURLConnection I called the completionHandler of the custom object, then I called the helper method again. Which would then dequeue the next request.
In code that would look like this:
@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];
This is the naive version. You have to think about error (and timeout) handling yourself.