ios - 每次请求完成后执行 NSURLConnection sendAsynchronousRequest "in order"的次数

标签 ios objective-c nsurlconnection

如何按顺序执行多个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/

相关文章:

iphone - 如何捕获 UIScrollView 或其他调用?

objective-c - UIWebView:访问操作系统图形/资源?

.Net UserControl XCode 等价物

ios - 下载存储在RAM中?

ios - 使用后退按钮打开网址

ios - 父 MOC 从子 MOC 获取空数据的变化

ios - 以下方法无法识别 UIButton 选择器

iphone - 由于某些字符,NSData 到 NSString 的转换失败

ios - 获取大小文件NSURLConnection?

iphone - 更改 NSURLConnection 的 userAgent