【问题标题】:NSURLConnection sendAsynchronous multiple requests not executedNSURLConnection sendAsynchronous多个请求未执行
【发布时间】:2015-01-14 06:29:45
【问题描述】:

我正在向 Web 服务发送 10 个 url 请求(在 for in 循环中)

预计会得到10个JSON格式的数据作为单独返回

这是我的代码:

NSArray *reqArray = [10 requests of url inside];
NSMutableArray * saveArray = [prepare to store 10 JSON data in here];
NSInteger counter = [reqArray count];

for (NSURLRequest *request in reqArray) {
    [NSURLConnection sendAsynchronousRequest:request
                                       queue:[NSOperationQueue mainQueue]
                           completionHandler:^(NSURLResponse *response, NSData *data, NSError *error) {
                               NSDictionary *result1 = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableContainers error:nil];
                               NSDictionary *result2 = [result1 objectForKey:@"keyForValueIWant"];
                               [saveArray addObject:result2];
                            counter -- ;
                               if (counter == 0) {
                                   NSLog(@"all done");

                               }
                           }];

}

completionHandler 永远不会被执行,我总是得不到任何回报。

我对 NSURLConnetion 有什么误解或者我做错了吗?

任何建议将不胜感激!

编辑

我发现代码在 viewDidLoad(我放它的地方)中的所有其他代码都完成后才被执行

即使我尝试将其包装在 dispatch_async(dispatch_get_main_queue(), ^{},

什么可以让它在我调用它时立即工作?发送同步请求?

【问题讨论】:

  • 那么,发生了什么?,completionHandler 内部的代码执行起来更紧张?还是延迟执行?,因为这是一个异步请求,它就是这样工作的,当你得到来自服务器的响应,completionHandler 块执行。
  • @gabuh 里面的代码被执行了......但我需要在运行其他代码之前完成它。现在尝试发送同步请求...严重卡住了我的程序:/
  • 在主线程中发送同步请求不是一个好主意。您应该考虑如何构建代码以处理异步请求。您正在加载一个数组,并且您需要该数组才能让您的程序工作。你用它做什么?,加载一个tableView?您可以在完成块中触发某些内容以重新加载取决于该数组内容的任何内容....
  • @gabuh 打开另一个队列以在我想要的确切位置在后台运行此循环,我想我应该深入 GCD ......那么谢谢。顺便说一句,如果您有时间回答我的另一个问题,那就太好了:stackoverflow.com/questions/28021281/…

标签: ios asynchronous queue httprequest nsurlconnection


【解决方案1】:

我猜你是从主循环开始这些连接,试试:

NSArray *reqArray = [10 requests of url inside];
NSMutableArray * saveArray = [prepare to store 10 JSON data in here];
NSInteger counter = [reqArray count];

for (NSURLRequest *request in reqArray) {
    dispatch_async(dispatch_get_main_queue(), ^{ 
        [NSURLConnection sendAsynchronousRequest:request
                                   queue:[NSOperationQueue mainQueue]
                       completionHandler:^(NSURLResponse *response, NSData *data, NSError *error)     {
                           NSDictionary *result1 = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableContainers error:nil];
                           NSDictionary *result2 = [result1 objectForKey:@"keyForValueIWant"];
                           [saveArray addObject:result2];
                        counter -- ;
                           if (counter == 0) {
                               NSLog(@"all done");

                           }
                       }];
    });
}

因为NSURLConnection需要一个runloop来执行,如果runloop结束,连接就结束了。

【讨论】:

    猜你喜欢
    • 2012-03-13
    • 1970-01-01
    • 1970-01-01
    • 2017-06-06
    • 1970-01-01
    • 1970-01-01
    • 2011-08-24
    • 2019-06-05
    • 2020-03-17
    相关资源
    最近更新 更多