我正在学习斯威夫特的Grand Central Dispatch。我已经了解到您可以创建自己的队列来执行代码。我还了解到你可以通过调用main返回主线程。我一直在使用断点来观察线程,因为代码被执行以试图更好地理解GCD。我注意到以下内容并试图理解它。
下面的代码是我的dataTask()。
let downloadQueue = DispatchQueue(label: "downloadQueue", attributes: [])
downloadQueue.async {() - >无效
let dataTask = self.session!.dataTask(with: self.sessionURL!, completionHandler: { (data, response, error) -> Void in
if error == nil
{
if data != nil
{
// Handle Data
}
else
{
// Handle Error
}
}
else if error != nil
{
self.sendErrorCodeEmail(errorCodeMessage) // The line from image2
}
})
dataTask.resume()
}
我的理解是放在downloadQueue.async {}闭包中的所有代码都是在downloadQueue上执行的。我为什么要搬到另一个队列?
答案 0 :(得分:1)
“为什么”问题总是有点好笑。从最直接的意义上说,because that's just how URLSession works:
与此会话相关的所有委托方法调用和完成处理程序都在此队列上执行。