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()
调用主线程。
我正在设计一个使用 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()
调用主线程。