Отключить оповещение после выполнения задачи на MainViewController swift - PullRequest
0 голосов
/ 10 декабря 2018

Мне нужно загрузить некоторый контент из API, когда пользователи впервые входят в мое приложение и показывают, что я это делаю.Я делаю это на моем MainViewController:

override func viewDidAppear(_ animated: Bool) {
        let alert = UIAlertController(title: nil, message: "Wait please...", preferredStyle: .alert)

        let loadingIndicator = UIActivityIndicatorView(frame: CGRect(x: 10, y: 5, width: 50, height: 50))
        loadingIndicator.hidesWhenStopped = true
        loadingIndicator.style = UIActivityIndicatorView.Style.gray
        loadingIndicator.startAnimating();

        alert.view.addSubview(loadingIndicator)
        present(alert, animated: true, completion: nil)

        let parceiroId = self.defaults.getParceiroId()
        if !self.defaults.getDownloadInicialTipoEntrega() {
            TipoEntregaAPI().loadTiposEntrega(parceiroId){ (dados) in
                if dados != nil {
                    for tipoEntrega in dados!{
                        // Do some stuff, no errors
                    }
                }
            }
        }

        if !self.defaults.getDownloadInicialPedido() {
            PedidoAPI().loadOrders(parceiroId){ (dados) in
                if dados != nil {
                    for pedidos in dados!{
                        // Do some stuff, no errors
                    }
                }
            }
        }
        self.dismiss(animated: false, completion: { () in print("Done") })
    }

Проблема в том, что мое предупреждение с загрузкой никогда не отклоняется.Он никогда не печатает «Готово».Может ли кто-нибудь помочь мне, пожалуйста?

Я не знаю, полезно ли это, но я всегда получаю это предупреждение:

Warning: Attempt to dismiss from view controller <MyApp.MainViewController: 0x0000000> while a presentation or dismiss is in progress!

Ответы [ 2 ]

0 голосов
/ 10 декабря 2018

Решение для меня (отлично работает и печатает "Готово"):

override func viewDidAppear(_ animated: Bool) {
        if !self.defaults.getDownloadInicialTipoEntrega() || !self.defaults.getDownloadInicialPedido() || !self.defaults.getDownloadInicialVitrine() {
            Functions.showAlertWaiting("Wait please...", self)
        }

        loadDeliveryTypesNOrders { (completed) in
            if completed {
                self.dismiss(animated: false, completion: { () in print("Done") })
            }
        }
    }

func loadDeliveryTypesNOrders (completion: @escaping (Bool) -> ()) {
        let parceiroId = self.defaults.getParceiroId()
        if !self.defaults.getDownloadInicialTipoEntrega() {
            TipoEntregaAPI().loadTiposEntrega(parceiroId){ (dados) in
                if dados != nil {
                    for tipoEntrega in dados!{
                        // Do some stuff, no errors
                    }
                }
            }
        }

        if !self.defaults.getDownloadInicialPedido() {
            PedidoAPI().loadOrders(parceiroId){ (dados) in
                if dados != nil {
                    for pedidos in dados!{
                        // Do some stuff, no errors
                    }
                }
            }
        }
        completion(true)
}
0 голосов
/ 10 декабря 2018

Проблема именно в том, что говорит ошибка.Ваш презентационный звонок не завершен в тот момент, когда вы звоните self.dismiss(...).Для дальнейшего объяснения вы звоните present(alert, animated: true, completion: nil) с параметром animated: true, поэтому презентация не будет завершена немедленно.С другой стороны, вы вызываете self.dismiss(animated: false, completion: { () in print("Done") }) в том же потоке в относительно коротком блоке инструкций, поэтому он выполняется до того, как iOS завершит анимированное представление диалога, и поэтому вы получаете сообщение об ошибке.

Но, кроме того, прежде чем на самом деле решить проблему, вы должны спросить себя, действительно ли вы хотите закрыть диалог, как только он будет представлен.Судя по опубликованному вами коду, я предполагаю, что вы хотите, чтобы он был отклонен после завершения одного или обоих вызовов API.В этом случае вам нужно переместить вызов метода dismiss в блок завершения (замыкания) ваших вызовов API.

...