每个Thread
都有自己的RunLoop
,DispatchQueue
如何与它们交互?DispatchQueue
是使用RunLoop
将任务分派给Thread
,还是使用其他方式?
任何线程都可以有运行循环,但现在,在实践中,只有主线程可以。
手动创建线程时,它将不会有运行循环。当您调用RunLoop.current
时,名称表明它正在获取线程的运行循环,表明它总是有一个。但实际上,当您调用current
时,如果已经存在运行循环,它将返回运行循环,如果没有,它将为您创建一个RunLoop
。正如文件所说:
如果线程还不存在运行循环,则会创建并返回一个运行循环。
如果你确实创建了一个运行循环,你必须自己旋转它(如这里所示;这个例子被过度简化了(。但我们不再经常这样做了。GCD使它在很大程度上过时了。
在高级别上,GCD具有工作线程池,每个服务质量(QoS(一个池。当您通过GCD向任何队列(而不是以main
队列为目标(调度某个东西时,它会获取一个具有适当QoS的可用工作线程,执行任务,并在完成后将该工作线程标记为可用于未来调度的任务。这些工作线程不需要(或不需要(运行循环。