每个Thread
都有自己的RunLoop
,DispatchQueue
如何与它们交互? DispatchQueue
是使用 RunLoop
将任务分派(dispatch)到 Thread
还是通过其他方式执行?
最佳答案
任何线程都可以有运行循环,但是现在,实际上只有主线程有。
当你手动创建线程时,它不会有运行循环。当您调用 RunLoop.current 时,顾名思义,它正在获取线程的运行循环,这表明它始终会有一个。但实际上,当您调用current
时,如果已经存在,它将返回运行循环,如果不存在,它会为您创建一个RunLoop
。如the docs说:
If a run loop does not yet exist for the thread, one is created and returned.
如果您确实创建了一个运行循环,则必须自己旋转它(如 here 所示;并且该示例过于简化)。但我们不再经常这样做了。 GCD 已使其在很大程度上变得过时。
在较高级别上,GCD 有多个工作线程池,每个池对应一个服务质量 (QoS)。当您通过 GCD 将某些内容分派(dispatch)到任何队列(除了针对 main
队列)时,它会获取适当 QoS 的可用工作线程,执行任务,完成后将工作线程标记为可用以备将来派发的任务。这些工作线程不需要(或不需要)运行循环。
关于swift - DispatchQueue 是使用 RunLoop 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70782419/