繁体   English   中英

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

[英]Do we need to update UI in main thread or in main queue?

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

DispatchQueue.main反过来给了我Queue而不是线程。 我将如何访问该线程或两者是一样的?

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

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

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

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

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

来自Apple文档:

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

所以,当你打电话的时候

DispatchQueue.main.async {
        //your code
}

此代码将提交到main队列,而main队列又在主线程上运行。

从并发编程指南中的Dispatch Queues

主调度队列

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

通常,GCD维护一个线程池,并且调度队列和线程之间没有1-1关系。 但主队列是特殊的:它绑定到主线程,调度到主队列的所有项都在主线程上执行。 (对于OperationQueue.main也是如此。)

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

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

//主线程

DispatchQueue.main.async
{ 
 //eg. 
 tableview.reloadData()
  // here you update your UI.
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM