如何按顺序执行多个NSURLConnection sendAsynchronousRequest
?
我必须执行各种异步请求并获得最终完成。
我想按特定顺序执行这些操作。 让我们说
sendAsynchronousRequest2 应该在 sendAsynchronousRequest1 完成后启动,依此类推...
ɲeuroburɳ这个问题的回答很有用。但是,它并没有解决我的问题
Waiting until two async blocks are executed before starting another block
帮助将不胜感激
最佳答案
我以前做过类似的事情。我使用了一个自定义对象,它包含一个 NSURLRequest
实例和一个 NSURLConnection 样式的 completionHandler
。这些对象已创建并添加到队列中。
辅助方法使请求出列并发送。在 NSURLConnection 的原始 completionHandler 中我调用了自定义对象的 completionHandler,然后我再次调用了 helper 方法。这将使下一个请求出列。
在看起来像这样的代码中:
@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];
这是天真的版本。您必须考虑自己处理错误(和超时)。
关于ios - 每次请求完成后执行 NSURLConnection sendAsynchronousRequest "in order"的次数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29006149/