DispatchQueue 是使用 RunLoop 吗?

Gri*_*rii 2 nsoperationqueue grand-central-dispatch runloop swift dispatch-queue

每个人Thread都有自己的RunLoop,如何DispatchQueue与他们互动?是DispatchQueue使用RunLoop分派任务Thread还是以其他方式完成?

Rob*_*Rob 5

任何线程都可以有运行循环,但是现在,实际上只有主线程有。

\n

当你手动创建一个线程时,它不会有运行循环。当您调用 时RunLoop.current,顾名思义,它正在抓取 thread\xe2\x80\x99s 运行循环,这表明它总是会有一个。但实际上,当您调用 时current,如果已经存在,它将返回运行循环,如果不存在,它会RunLoop为您创建一个。正如文档所说:

\n
\n

如果线程尚不存在运行循环,则会创建并返回一个运行循环。

\n
\n

如果您确实创建了一个运行循环,则必须自己旋转它(如此处所示并且该示例过于简单)。但我们不再经常这样做了。GCD 使其基本上变得过时了。

\n

在较高级别上,GCD 有多个工作线程池,每个池对应一个服务质量 (QoS)。当您通过 GCD 将某些内容分派到任何队列(而不是定位队列main)时,它会获取适当 QoS 的可用工作线程,执行任务,并在完成后将工作线程标记为可用于将来分派的任务。这些工作线程不需要(或不需要)运行循环。

\n