DispatchQueue 是否使用了 RunLoop?
Is DispatchQueue using RunLoop?
每个Thread
都有自己的RunLoop
,DispatchQueue
如何与他们互动? DispatchQueue
是使用 RunLoop
将任务分派给 Thread
还是通过其他方式?
任何线程都可以有一个 运行 循环,但是现在,在实践中,只有主线程有。
当您手动创建线程时,它不会有 运行 循环。当你调用 RunLoop.current
时,顾名思义它正在抓住线程的 运行 循环,暗示它总是会有一个。但实际上,当你调用 current
时,如果已经存在,它会 return 循环 运行 ,如果没有,它会为你创建一个 RunLoop
。正如 the docs 所说:
If a run loop does not yet exist for the thread, one is created and returned.
如果您确实创建了一个 运行 循环,则必须自己旋转它(如图 here 所示;并且该示例过于简单)。但我们不再经常这样做了。 GCD 已使它在很大程度上已过时。
在较高层次上,GCD 具有工作线程池,每个池对应一种服务质量 (QoS)。当您通过 GCD 将某些内容分派到任何队列时(目标 main
队列除外),它会获取适当 QoS 的可用工作线程,执行任务,并在完成后将工作线程标记为可用于将来分派任务。这些工作线程不需要(或不需要)运行 循环。
每个Thread
都有自己的RunLoop
,DispatchQueue
如何与他们互动? DispatchQueue
是使用 RunLoop
将任务分派给 Thread
还是通过其他方式?
任何线程都可以有一个 运行 循环,但是现在,在实践中,只有主线程有。
当您手动创建线程时,它不会有 运行 循环。当你调用 RunLoop.current
时,顾名思义它正在抓住线程的 运行 循环,暗示它总是会有一个。但实际上,当你调用 current
时,如果已经存在,它会 return 循环 运行 ,如果没有,它会为你创建一个 RunLoop
。正如 the docs 所说:
If a run loop does not yet exist for the thread, one is created and returned.
如果您确实创建了一个 运行 循环,则必须自己旋转它(如图 here 所示;并且该示例过于简单)。但我们不再经常这样做了。 GCD 已使它在很大程度上已过时。
在较高层次上,GCD 具有工作线程池,每个池对应一种服务质量 (QoS)。当您通过 GCD 将某些内容分派到任何队列时(目标 main
队列除外),它会获取适当 QoS 的可用工作线程,执行任务,并在完成后将工作线程标记为可用于将来分派任务。这些工作线程不需要(或不需要)运行 循环。