How to tell what queue a completionHandler executes on?

Dec*_*nna 6 asynchronous grand-central-dispatch ios completionhandler swift

查看文档URLSession.dataTask很明显这个函数是异步调用的,但没有提到 completionHandler 是否返回到主线程、调用它的线程或保留在执行 dataTaskOperation 的线程上。

这里有一个普遍的约定吗?

  let task = URLSession.shared().dataTask(with: request) {
        //What Thread are we on here?
    }
Run Code Online (Sandbox Code Playgroud)

rma*_*ddy 7

completionHandler参数的文档中URLSession dataTask

该处理程序在委托队列上执行。

那么下一个问题是,什么是委托队列?这一切都取决于如何URLSession设置。您正在使用shared设置nil委托队列的会话。该方法queue参数的文档init说明:

如果为零,会话将创建一个串行操作队列,用于执行所有委托方法调用和完成处理程序调用。

因此,您发布的代码导致在后台串行队列上调用完成处理程序。