【问题标题】:iOS which thread NSURLConnection sendAsynchronousRequest runs oniOS 在哪个线程 NSURLConnection sendAsynchronousRequest 上运行
【发布时间】:2016-02-23 17:44:58
【问题描述】:

我正在使用以下代码进行网络调用。我知道响应将在 mainQueue 中运行,因为我已将队列参数指定为 [NSOperationQueue mainQueue] 但我想知道实际的 sendAsynchronousRequest 操作将在哪里执行。该操作是从 mainThread 调用的,所以它会在主线程上异步运行还是 NSURLConnection 自动创建后台线程?没有这方面的文档,iOS 仪器也没有显示分离的后台线程,所以想知道这到底是如何工作的! Apple 文档没有提供这方面的详细信息。

顺便说一句,我知道这已被弃用,但我们还有遗留代码尚未迁移以使用 NSURLSession

[NSURLConnection sendAsynchronousRequest:urlRequest
                                   queue:[NSOperationQueue mainQueue]
                       completionHandler:^(NSURLResponse *response, NSData *data, NSError *error) {
                           if(completion) {
                               completion(data, error);
                           }
                       }];

使用以下版本时同样的问题;

self.urlConnection = [NSURLConnection connectionWithRequest:urlRequest delegate:self];

这里也不确定这个请求在哪个线程上执行以及如何让它异步运行!

【问题讨论】:

  • 是它给你带来了问题还是你只是好奇?
  • 它不会引起任何问题,但我想确保操作不能在主线程上运行,并且应该在其他线程上分离。除非绝对需要,否则我不想在后台线程上调度。

标签: ios nsurlconnection nsoperationqueue networkonmainthread


【解决方案1】:

NSURLConnection 使用自己的内部队列。它现在是NSURLSession 的包装器,您可以通过在线程列表中查找com.apple.NSURLSession-work 来找到队列(如果您有兴趣)。

【讨论】:

  • 谢谢罗伯!那会在后台线程还是主线程上运行?
  • 根据定义,内部队列不是主队列。并且只有主队列在主线程上运行。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-02-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多