我正在设计一个使用NSURLSession的应用程序,并考虑将它放在与Grand Central Dispatch不同的线程中,但如果NSURLSession在后台自动执行此操作,那么我不必使用GCD,对吗?
换句话说,NSURLSession会在后台自动使用Grand Central Dispatch,所以我们不必担心吗?
答案 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将进行后台操作。您不必担心这会阻止您的用户界面。