我阅读了许多关于需要在主线程更新UI的文章,但是每当我更新UI时,总是看到代码。
DispatchQueue.main
会返回队列而不是线程。我应该如何访问线程或它们是否相同?
我阅读了许多关于需要在主线程更新UI的文章,但是每当我更新UI时,总是看到代码。
DispatchQueue.main
会返回队列而不是线程。我应该如何访问线程或它们是否相同?
想象一个火车站,每一辆火车的编号都与其离开的站台号码相同。
因此,如果你要搭乘#1列车,你就要站在#1站台上。如果不先站在站台上,就无法上车。其他想要搭乘这辆火车的人也要站在站台上等待他们上车的机会。
火车是线程,站台是队列。
如果想进入主线程,请加入主队列。
来自并发编程指南中的调度队列:
主调度队列
主调度队列是一个全局可用的串行队列,它在应用程序的主线程上执行任务。如果存在运行循环,则此队列与应用程序的运行循环一起工作,以交错执行排队任务和执行其他附加到运行循环的事件源。由于它在应用程序的主线程上运行,主队列经常被用作应用程序的关键同步点。
通常,GCD维护一个线程池,调度队列和线程之间没有1-1的关系。但主队列是特殊的:它与主线程绑定,所有分派到主队列的项目都在主线程上执行。(OperationQueue.main
也是如此。)
将代码分派到DispatchQueue.main
(或OperationQueue.main
)可以确保其在主线程上执行,并与其他UI更新同步。
在这种意义上,“在主线程上执行”和“在主队列上执行”这些术语经常可以互换使用。
DispatchQueue管理在特定线程上的代码执行。
来自苹果文档:
DispatchQueue管理工作项的执行。提交到队列的每个工作项都在由系统管理的线程池上处理。
因此,当您调用
DispatchQueue.main.async {
//your code
}
这段代码提交到main
队列,然后在主线程上运行。
//主线程
DispatchQueue.main.async
{
//eg.
tableview.reloadData()
// here you update your UI.
}
reloadData
,而不是 relodedata
。 - Papershine
DispatchQueue.main
允许您将队列和块添加到主线程上调用。该块内的代码不会立即被调用,但这是为了避免冻结调用它的线程。 - SzuDispatchQueue.main
访问主队列,您可以将任务排队等待在主线程上执行,直到队列管理器安排执行您的任务为止。 - vacawama