DispatchQueue.main.async 的初学者问题

Posted

技术标签:

【中文标题】DispatchQueue.main.async 的初学者问题【英文标题】:Beginner question on DispatchQueue.main.async 【发布时间】:2020-03-03 17:48:59 【问题描述】:

MainViewController 中,在viewDidLoad() 中,我正在调用一个函数,该函数依次测试Auth.auth().currentUser == nil; 是否满足条件,然后要执行的语句 呈现另一个视图控制器。

在if语句中,为什么要执行的语句前面需要DispatchQueue.main.async(如果我不写DispatchQueue.main.async那么视图控制器不存在,它只是卡在MainViewController)。

【问题讨论】:

【参考方案1】:

因为在调用 viewDidLoad 时,您的视图控制器尚未添加到视图层次结构中。不属于视图层次结构的视图控制器不能呈现另一个视图控制器。您应该在控制台中收到一条日志消息,说明与您尝试在没有异步调度的情况下呈现另一个视图控制器时类似的内容。

将调用放在DispatchQueue.main.async 中会导致演示延迟到下一个runloop 循环,这恰好足以让您的视图控制器在被调用后被添加到视图层次结构中。

更好的解决方案是将您当前的用户检查放在更合适的位置,可能是viewDidAppear

【讨论】:

【参考方案2】:

使用 Dispatch.main.async 的原因是所有相关的 UI 都必须在 mainQueue 上执行。由于 UIViewController 呈现是一个 UI 任务,因此在 mainQueue 上执行

另外,要回答为什么在不使用 Dispatch.main 时它不显示,可能是您在一个非主线程上执行此操作。

【讨论】:

以上是关于DispatchQueue.main.async 的初学者问题的主要内容,如果未能解决你的问题,请参考以下文章

为啥 DispatchQueue.main.async 会影响单元格自动调整大小?

SwiftUI - HealthKit 中的 DispatchQueue.main.async

SwiftUI - HealthKit 中的 DispatchQueue.main.async

Swift 5:我无法让我的 UITableView 及时更新(同时使用 `DispatchQueue.global().sync` 和 `DispatchQueue.main.async`

在 DispatchQueue.main.async 上运行代码是不是更慢?

DispatchQueue.main.async 的初学者问题