NSURLSession是在一个单独的线程中发生的吗?

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

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

是,

NSURLSession在后台线程中完成它的工作。 下载总是在后台线程上进行。


编辑:

没有理由在GCD调用中包装调用NSURLSession (或Swift 3 / Swift 4中的NSURLSession的代码。


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

以下是NSURLSession请求的示例:

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

从文档:“此方法旨在替代sendAsynchronousRequest:queue:completionHandler:NSURLConnection的方法,增加了支持自定义身份validation和取消的function。” 简短的回答是:是的,NSURLSession将进行后台操作。 您不必担心这会阻止您的UI。