我正在使用以下代码向我的服务器发出请求:
let configuration = URLSessionConfiguration.default
let session = URLSession(configuration: configuration)
let dataTask = session.dataTask(with: request as URLRequest) { (data, response, error) in
if error != nil {
DispatchQueue.main.async(execute: {
completion(nil, error as NSError?)
})
return
}
DispatchQueue.main.async(execute: {
code...
})
}
dataTask.resume()
从我所看到的,这不应该阻止主线程,但它似乎正在这样做。我是否需要在调度到另一个线程后调用此代码?即:
DispatchQueue.global(qos: DispatchQoS.QoSClass.userInitiated).async {
}
或者是dataTask本身是异步请求的,以便不阻塞主线程并将其分配到另一个线程将是多余的?
答案 0 :(得分:4)
是系统URLSession
dataTask
本质上是async
。每当使用完成处理程序进行系统API调用时,API本质上始终为async
。总结一下,上面的实现是正确的。您无需将任务放在全局队列中。