Не показывается Activity indicator после AlertController


#1

Не получается запустить колесико загрузки после нажатия кнопки ОК на алерт контроллере - оно начинает вращаться только после завершения тяжелого кода и если stopAnimating() не указывать. Как это можно исправить?

lazy var activityIndicator: UIActivityIndicatorView = {
        let activityIndicator = UIActivityIndicatorView(activityIndicatorStyle: .whiteLarge)
        activityIndicator.center = view.center
        activityIndicator.autoresizingMask = [.flexibleLeftMargin, .flexibleRightMargin, .flexibleTopMargin, .flexibleBottomMargin]
        activityIndicator.color = .black
        activityIndicator.hidesWhenStopped = true
        return activityIndicator
    }()

...

let alertController = UIAlertController(title: "Add", message: "", preferredStyle: .alert)
alertController.addAction(UIAlertAction(title: "Ok", style: .default, handler: { _ in

self.activityIndicator.startAnimating()
self.view.addSubview(self.activityIndicator)

timeConsumingFunc()

self.activityIndicator.stopAnimating()
self.activityIndicator.removeFromSuperview()
}))

present(alertController, animated: true)

#2

Вы запускаете “тяжёлый” код в основном потоке, у вас не просто колёсико не запускается, у вас всё приложение виснет.

Попробуйте тяжёлый код выполнять в фоне:

alertController.addAction(UIAlertAction(title: "Ok", style: .default) { _ in
    
    self.activityIndicator.startAnimating()
    self.view.addSubview(self.activityIndicator)
    
    DispatchQueue(label: "background").async {
        timeConsumingFunc()
        DispatchQueue.main.async {
            self.activityIndicator.stopAnimating()
            self.activityIndicator.removeFromSuperview()
        }
    }
})

#3

Спасибо! В чем разница между созданием DispatchQueue(label: “***”).async и DispatchQueue.global(qos: .***).async?


#4

#5

Я как раз сегодня читал эту статью :smiley: Понятно, что это глобальная параллельная очередь, DispatchQueue.async - просто приватная. Но в каком случае какую использовать не совсем понял


#6

В вашем конкретном случае без разницы, главное что в отдельном потоке.