NSURLSession 是否发生在单独的线程中?

Does NSURLSession Take place in a separate thread?

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

那么换句话说,NSURLSession是不是在后台自动使用Grand Central Dispatch,所以我们不用担心?

这是一个 NSURLSession 请求的例子:

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

  }] resume];

来自文档:"This method is intended as an alternative to the sendAsynchronousRequest:queue:completionHandler: method of NSURLConnection, with the added ability to support custom authentication and cancellation." 简短的回答是:是的,NSURLSession 会做后台操作。您不必担心这会阻塞您的 UI.

是的,

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


编辑:

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


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