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

时间:2015-06-15 20:34:56

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

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

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

2 个答案:

答案 0 :(得分:15)

是,

NSURLSession在后台线程中工作。下载始终发生在后台线程上。

编辑:

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

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

答案 1 :(得分:3)

以下是NSURLSession请求的示例:

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

  }] resume];

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