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

7

我阅读了许多关于需要在主线程更新UI的文章,但是每当我更新UI时,总是看到代码。

DispatchQueue.main会返回队列而不是线程。我应该如何访问线程或它们是否相同?


始终在主线程上更新用户界面。基本上,MainQueue会添加您的代码块以在主线程上执行。 - Tanvir Nayem
DispatchQueue.main 允许您将队列和块添加到主线程上调用。该块内的代码不会立即被调用,但这是为了避免冻结调用它的线程。 - Szu
我的疑虑是,如果我需要在主线程中更新UI,为什么我要访问主队列或者说访问主队列本身就是在访问主线程。 - Dipesh Pokhrel
队列会将作业添加到线程中吗? - Tj3n
1
@Tj3n 间接意味着主队列本身就是主线程吗?或者我们可以这样陈述,在IOS编程中,UI更新应该在主队列上完成。 - Dipesh Pokhrel
队列是一系列将来要执行的任务列表。通过使用 DispatchQueue.main 访问主队列,您可以将任务排队等待在主线程上执行,直到队列管理器安排执行您的任务为止。 - vacawama
4个回答

23

想象一个火车站,每一辆火车的编号都与其离开的站台号码相同。

因此,如果你要搭乘#1列车,你就要站在#1站台上。如果不先站在站台上,就无法上车。其他想要搭乘这辆火车的人也要站在站台上等待他们上车的机会。

火车是线程,站台是队列。

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


这个主题上我见过的最好的解释之一。 - nayem
这是一种叫做解释的东西,你太棒了,我喜欢它。 - Dipesh Pokhrel
4
“车次和站台号相同”这个类比表明队列和线程之间存在一对一的关系,但实际上并不存在。发送到不同(非主)队列的项目可以在同一个线程上执行(甚至在主线程上),而发送到同一个队列的不同项目可能会在不同的线程上执行。 - Martin R

8

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

主调度队列

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

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

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

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


3

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

来自苹果文档:

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

因此,当您调用

DispatchQueue.main.async {
        //your code
}

这段代码提交到main队列,然后在主线程上运行。


谢谢提供链接。但是,如果我说“所有UI更新必须在主队列上完成,这比在主线程上更有意义,因为应用程序员无法访问主队列的主线程。”请指导。 - Dipesh Pokhrel
主线程和主队列在本问题(以及几乎所有使用情况)中是相同的,但它们并不完全相同。此外,并不总是使用主队列来访问主线程,因此更改措辞只会令另一类用户感到困惑! - Stephen Darlington
仅仅说UI更新应该在主队列上完成是不完整的,因为它限制了人们只能使用DispatchQueue来进行UI更改的理解。由于还有其他方式可以在主线程上执行代码,因此DispatchQueue只是其中之一。 - UditS
谢谢,@StephenDarlington UditS。你的陈述现在看起来非常合乎逻辑和准确。 - Dipesh Pokhrel

0

//主线程

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

如果您想更新表视图的用户界面,那么请添加(tableview.relodedata()),否则随意。这只是一个例子。 - SAXENA
你是不是想说reloadData - Papershine
你链接的方法叫做 reloadData,而不是 relodedata - Papershine
让我们在聊天中继续这个讨论 - SAXENA

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接