关于 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
中会导致演示延迟到下一个运行循环周期,这恰好足以让您的视图控制器在被调用后被添加到视图层次结构中。
更好的解决方案是将当前用户检查放在更合适的位置,可能 viewDidAppear
。
使用 Dispatch.main.async 的原因是所有 UI 相关的操作都必须在 mainQueue 上执行。由于 UIViewController 表示是一个 UI 任务,因此在 mainQueue
上执行
此外,要回答为什么在未使用 Dispatch.main 时不显示,可能是您在非主线程上执行此操作。
在 MainViewController
中,在 viewDidLoad()
中我正在调用一个函数,该函数依次测试 Auth.auth().currentUser == nil;
如果满足条件则执行 语句 呈现另一个视图控制器。
if语句中,为什么要执行的语句前面需要加上DispatchQueue.main.async
(如果我不写DispatchQueue.main.async
那么视图控制器不存在,它只是停留在 MainViewController
)。
因为在调用 viewDidLoad
时您的视图控制器尚未添加到视图层次结构中。不属于视图层次结构的视图控制器不能呈现另一个视图控制器。当您尝试在没有异步调度的情况下呈现另一个视图控制器时,您应该会在控制台中收到一条日志消息,内容与此类似。
将调用放在 DispatchQueue.main.async
中会导致演示延迟到下一个运行循环周期,这恰好足以让您的视图控制器在被调用后被添加到视图层次结构中。
更好的解决方案是将当前用户检查放在更合适的位置,可能 viewDidAppear
。
Dispatch.main.async 的原因是所有 UI 相关的操作都必须在 mainQueue 上执行。由于 UIViewController 表示是一个 UI 任务,因此在 mainQueue
上执行此外,要回答为什么在未使用 Dispatch.main 时不显示,可能是您在非主线程上执行此操作。