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

时间:2018-07-05 10:42:18

标签: ios grand-central-dispatch

我读了很多文章,这些文章指定我们需要在主线程中更新UI,但是每当更新UI时,代码始终是。

DispatchQueue.main,这反过来给了我Queue not thread。我究竟将如何访问该线程,或者两者都是相同的?

4 个答案:

答案 0 :(得分:7)

想象一个火车站,那里的火车编号与其离开的平台的编号相同。

因此,如果您想要#1火车,您可以站在#1平台上。您必须先站在月台上才能上火车。其他想上这趟火车的人也站在平台上,等待他们上火车的机会。

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

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

答案 1 :(得分:2)

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

摘自Apple文档:

  

DispatchQueue管理工作项的执行。每个工作项   提交到队列的内容是在由   系统。

所以,当您致电

DispatchQueue.main.async {
        //your code
}

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

答案 2 :(得分:2)

来自《并发编程指南》中的Dispatch Queues

  

主调度队列

     

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

通常,GCD维护一个线程池,并且没有1-1 调度队列和线程之间的关系。但是主队列 特殊:它与主线程绑定,所有项目都已分派 到主队列的操作在主线程上执行。 (同样是 OperationQueue.main为真。)

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

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

答案 3 :(得分:0)

//主线程

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