我一直在使用NSURLConnection'ssendAsynchronousRequest:queue:completionHandler:方法,这很好.但是,我现在需要连续发出多个请求.

在仍然使用这种伟大的非同步方法的情况下,我如何做到这一点?

推荐答案

根据你想要的行为,有很多方法可以做到这一点.

您可以一次发送一组异步请求,跟踪已完成的请求数,并在所有请求完成后执行某些操作:

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];

或者,您可以在一个非同步块中同步执行所有请求:

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];
        });
    });
});

另外,如果你使用其中任何一个,你应该添加一些错误判断.

Objective-c相关问答推荐

Objective-C:如何向 NSURL 添加查询参数?

错误:协议不可用,正在转储回溯

为什么当我使其处于非活动状态时,弱 IBOutlet NSLayoutConstraint 变为 nil?

Crashlytics iOS - 记录捕获的异常

首次提交应用内购买以供审核

在 ios8 中没有调用 didRegisterForRemoteNotificationsWithDeviceToken,但是 didRegister...Settings 是

BSXPCMessage 收到消息错误:连接中断

如何为 iPhone 6/7 自定义边到边图像指定尺寸?

从 Storyboard 实例化视图控制器与创建新实例

如何调整 UITableView 中原型单元格的左边距?

远程通知 iOS 8

UITableView 在半透明的导航栏下

使用自动布局以编程方式更改框架

UITextField secureTextEntry 带有自定义字体的项目符号?

升级到 Xcode 5.1 和 iOS 7.1 后,在 segue 过渡期间导航栏上出现暗影

UILabel 的角半径属性在 iOS 7.1 中不起作用

iOS 7 - viewDidLoad 和 viewDidAppear 之间的区别

UIApplication.sharedApplication.delegate.window 和 UIApplication.sharedApplication.keyWindow 有什么区别?

点击手势识别器 - 哪个对象被点击了?

字符串的静态 NSArray - 如何/在哪里初始化视图控制器