看来你有问题 DispatchQueue :)
DispatchQueue
您的程序在运行时使用操作队列。这个队列可以是系统定义的(比如 main )或用户定义。当你使用 DispatchQueue.main.async(_:) 您将代码块排入主队列。当他们的时间到来时,主队列执行它们。
main
DispatchQueue.main.async(_:)
但在 viewDidLoad(_:) ,你已经在 main 队列。还有,打电话的原因 AlertController 是一个UI操作,无法在任何队列上执行UI操作 main ,您不需要将代码块发送到任何队列,您不应该。
viewDidLoad(_:)
AlertController
而且,就像@ SeanRobinson159所说的那样, AlertController 它在屏幕上时不会阻止主线程。它就像你的一样 ViewControllers 。
ViewControllers
的 那么,你应该使用哪种情况 DispatchQueue 打电话给 AlertController 强>
你应该用 DispatchQueue.main.async(_:) 发送执行UI操作的代码块(如调用 AlertController 或改变 UILabel 的文本),来自不同队列的主队列。例如,您可能正在进行网络操作。您可以在不同的线程中进行操作,当结果出现时,您可以将进行UI操作的代码块发送到主队列。
UILabel
您可以使用谷歌GCD(Grand Central Dispatch)获取有用的信息。
你应该只把你的东西 的 不得不 强> 在主线程上。所以你不应该把它包装在viewDidLoad函数的main.async块中。
你应该把它包装成一个 DispatchQueue 具有不同的优先级。
即 DispatchQueue.global(qos: .userInitiated).async { }
DispatchQueue.global(qos: .userInitiated).async { }
显示警报不会阻止该线程。 present(_:animated:completion:) 不是阻塞操作,因此没有理由添加任何这些操作 .async 调用。
present(_:animated:completion:)
.async
也就是说,你不想试图在里面发出警报 viewDidLoad 。那太早了。您的视图控制器尚未出现在屏幕上。你应该放 showAlert() 在 viewDidAppear ,并删除所有 .async 调用。
viewDidLoad
showAlert()
viewDidAppear
作为一般规则,在任何情况下,这些类型的模态警报应该是最后的手段,尤其是当视图控制器进入屏幕时。通常,您应该将要呈现给用户的任何消息集成到视图本身中,而不是阻止整个UI。但是如果警报是合适的(有时它们是),那么只要您在主队列中,就可以直接呈现它们。