Кажется, у вас проблема с DispatchQueue
:)
Ваша программа во время работы использует очереди операций.Эти очереди могут быть системными (например, main
) или пользовательскими.Когда вы используете DispatchQueue.main.async(_:)
, вы помещаете блок кода в основную очередь.Когда наступит их время, основная очередь выполнит их.
Но в viewDidLoad(_:)
вы уже в очереди main
.Кроме того, причиной вызова AlertController
является операция пользовательского интерфейса, и операции пользовательского интерфейса не могут быть выполнены ни в какой очереди, кроме main
, вам не нужно отправлять свой блок кода в какую-либо очередь, и вы не должны.
А также, как сказал @ SeanRobinson159, AlertController
не блокирует основной поток, когда он находится на экране.Он работает как ваш ViewControllers
.
Итак, в каких случаях вы должны использовать DispatchQueue
для вызова AlertController
Вы должны использовать DispatchQueue.main.async(_:)
дляотправить блоки кода, которые выполняют операции пользовательского интерфейса (например, вызов AlertController
или изменение текста UILabel
), в основную очередь из другой очереди.Например, может быть, вы работаете в сети.Вы выполняете свою операцию в другом потоке, и когда приходит результат, Вы можете отправить свой блок кода, который выполняет операции пользовательского интерфейса, в основную очередь.
Вы можете использовать Google GCD (Grand Central Dispatch) для получения подробной информации.