我们需要在主线程或主队列中更新UI吗?

Dip*_*esh 2 grand-central-dispatch ios

我读了很多文章,指出我们需要更新主线程中的UI,但是每当我更新我的UI时总是代码.

DispatchQueue.main作为回报,它给了我Queue而不是线程.我将如何访问该线程或两者是一样的?

mat*_*att 10

想象一下火车站,火车的数量与它离开的平台的数量相同.

因此,如果您想要#1列车,那么您就站在#1平台上.没有先站在平台上就无法上火车.其他想乘坐这列火车的人也站在平台上等待他们上火车的机会.

火车是线程.平台就是队列.

如果你想进入主线程,请进入主队列.

  • “列车数与站台数相同”的比喻暗示了队列和线程之间的1-1关系,这是不存在的。分派到不同(非主)队列的项目可以在同一个线程(甚至是主线程)上执行,分派到同一个队列的不同项目可以在不同的线程上执行。 (4认同)

Mar*_*n R 8

来自并发编程指南中的调度队列

主调度队列

主调度队列是一个全局可用的串行队列,它在应用程序的主线程上执行任务。该队列与应用程序的运行循环(如果存在)一起工作,以将排队任务的执行与附加到运行循环的其他事件源的执行交错​​。因为它在应用程序的主线程上运行,所以主队列通常用作应用程序的关键同步点。

一般GCD维护一个线程池,调度队列和线程之间没有1-1的关系。但是主队列比较特殊:它绑定到主线程,所有分派到主队列的项目都在主线程上执行。(同样适用于OperationQueue.main。)

将代码分派到DispatchQueue.main(或OperationQueue.main) 确保它在主线程上执行,并与其他 UI 更新同步。

从这个意义上说,术语“在主线程上执行”和“在主队列上执行”通常可以互换使用。


Udi*_*itS 3

DispatchQueue 管理特定线程上代码的执行。

来自苹果文档:

DispatchQueue 管理工作项的执行。提交到队列的每个工作项都在系统管理的线程池上进行处理。

所以,当你打电话时

DispatchQueue.main.async {
        //your code
}
Run Code Online (Sandbox Code Playgroud)

该代码被提交到main队列,该队列又在主线程上运行。