У меня проблема с отображением предупреждения. Я использую UIAlertController. Когда пользователь нажимает кнопку отправки, сразу же должно отображаться предупреждение «Подождите ...», пока приложение выполняет некоторые операции. Предупреждение закрывается после завершения операций. У меня большая задержка (несколько секунд) до того, как будет представлено предупреждение, хотя предупреждение должно быть представлено еще до того, как я начну выполнять операции. Я попробовал отправить async и попытался использовать замыкания, но ничего не работает ... все еще задержка в несколько секунд до появления предупреждения. Как сделать так, чтобы предупреждение появлялось сразу после нажатия кнопки?
override func viewDidLoad() {
super.viewDidLoad()
submitButton.addTarget(self,action:#selector(buttonAction),for:.touchUpInside)
}
@objc func buttonAction(){
waiting()
doOperations()
}
func waiting(){
DispatchQueue.main.async{
let alert = UIAlertController(title: nil, message: "Please wait...", preferredStyle: .alert)
let loadingIndicator = UIActivityIndicatorView(frame: CGRect(x: 10, y: 5, width: 50, height: 50))
loadingIndicator.hidesWhenStopped = true
loadingIndicator.activityIndicatorViewStyle = UIActivityIndicatorViewStyle.gray
loadingIndicator.startAnimating()
alert.view.addSubview(loadingIndicator)
self.present(alert, animated: false, completion: nil)
}
}
func doOperations(){
...
}
func dismissWaiting{
...
//dismiss alert
}
зачем вы пишете эту строчку: alert.view.addSubview (loadingIndicator) удалите эту строчку.
да, я пробовал это ... я удалил весь код индикатора загрузки, и все еще была задержка до появления предупреждения
Есть ли какие-то другие задачи, которые постоянно выполняются в основном потоке?
Определите проблемную часть, прокомментируйте функцию doOperations и позвольте коду waiting работать и посмотрите, что произойдет.
NeverHopeless: да, я закомментировал doOperations (), и задержки не было .... так что doOperations () каким-то образом вызывает задержку. без DispatchQueue.main.async весь код в wait () запускается до того, как код в doOperations ... с DispathQueue.main.async код в doOperations запускается до ожидающего кода. Я проверил это, просто используя операторы печати. в обоих случаях я получаю одинаковую задержку в представлении предупреждения. Рики Мо: Я не знаю, как это проверить, но этого не должно быть. Я почитаю, как проверить





Просто отправьте предупреждение в основной поток.
Привет, я решил проблему, просто позвонив на doOperations в завершении представления предупреждения. Нравится:
self.present(alert, animated: false, completion: {self.doOperations()})
Теперь оповещение появляется сразу после нажатия кнопки, и все работает нормально. Спасибо, ребята, за все предложения.
Вы пробовали ничего не добавлять в UIAlertControler? например, удалите эту строку:
alert.view.addSubview(loadingIndicator)