繁体   English   中英

DispatchQueue.main.async 的初学者问题

[英]Beginner question on DispatchQueue.main.async

MainViewController ,在viewDidLoad()我调用了一个函数,该函数反过来测试Auth.auth().currentUser == nil; 如果满足条件,则要执行语句会显示另一个视图控制器。

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

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

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

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

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

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

暂无
暂无

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

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