【问题标题】:Does NSURLSession Take place in a separate thread?NSURLSession 是否发生在单独的线程中?
【发布时间】:2015-08-31 12:00:09
【问题描述】:

我正在设计一个使用 NSURLSession 的应用程序,并考虑将它放在与 Grand Central Dispatch 不同的线程中,但如果 NSURLSession 自动在后台执行此操作,那么我就不必使用 GCD 了,对吗?

也就是说,NSURLSession 是不是自动在后台使用 Grand Central Dispatch,我们就不用担心了?

【问题讨论】:

    标签: ios objective-c grand-central-dispatch nsurlsession


    【解决方案1】:

    这是一个 NSURLSession 请求的示例:

    [[session dataTaskWithURL:[NSURL URLWithString:someURL]
          completionHandler:^(NSData *data,
                              NSURLResponse *response,
                              NSError *error) {
            // handle response
    
      }] resume];
    

    来自文档:“此方法旨在替代 NSURLConnection 的 sendAsynchronousRequest:queue:completionHandler: 方法,并增加了支持自定义身份验证和取消的能力。” 简短的回答是:是的,NSURLSession 会做后台操作。您不必担心这会阻塞您的 UI。

    【讨论】:

    • 您的答案是关于已弃用的 NSURLConnection。但问题是关于 NSURLSession。
    • 更新了我对 NSURLSession 的回答
    • 后台操作是另一回事。 NSURLSession 总是使用后台线程从远程设备传输数据。当NSURLSession 上的文档谈论后台时,他们是在谈论让您的下载/数据任务继续执行,即使您的应用处于后台、暂停甚至终止。
    【解决方案2】:

    是的,

    NSURLSession(Swift 中的 URLSession)在后台线程中工作。下载总是在后台线程上异步进行。


    编辑:

    没有理由将调用 NSURLSession(或 Swift 3 或更高版本中的 URLSession)的代码封装在 GCD 调用中。


    您可以通过在delegateQueue参数中传递给init方法的队列来控制它的完成方法是否在后台线程上执行。如果你传入 nil,它会创建一个(后台线程)串行操作队列,在其中调用你的完成方法。如果您传入NSOperationQueue.mainQueue()(最新版本的Swift 中为OperationQueue.mainQueue()),那么您的完成委托方法/闭包将在主线程上调用,您不必将UI 调用包装在dispatch_async() 对主线程的调用中.

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-03-11
      • 1970-01-01
      • 2023-03-04
      • 1970-01-01
      相关资源
      最近更新 更多