Swift: Различия между закрытием UIAlertView в iOS12 и iOS13 - PullRequest
0 голосов
/ 23 сентября 2019

ОБЗОР

Существует NavigationController, который представляет UIAlertView при подключении к интерфейсу BLE.

Расширение для представления UIAlertView

private extension UIViewController {
    final func showAlert(title: String, msg: String, timeout: Double?, presentActivity: (() -> Void)?, timeoutActivity: (() -> Void)?) {
        DispatchQueue.main.async {
            let alert: UIAlertController = UIAlertController(title: title, message: msg, preferredStyle: .alert)
            self.present(alert, animated: true, completion: presentActivity)
                if timeout != nil {
                   DispatchQueue.main.asyncAfter(deadline: DispatchTime.now() + timeout!) {

                   //My suggestion
                   if(self.presentedViewController != nil) {
                       self.dismiss(animated: true, completion: timeoutActivity)
                   }

                }
            }
        }
    }
}

В NavigationController есть функция делегата, которая сообщает NavigationController, что процесс соединения выполняется.В этой функции вызывается функция showAlert.

Вызовите showAlert

showAlert(title: "BLE", msg: "Wait", timeout: 10, presentActivity: self.checkConnection, timeoutActivity: cancelConnection)

Чтобы проверить, установлено ли соединение, существует следующая функция presentActivity.

Проверьте соединение и отклоните предупреждение, если соединение установлено

private final func checkConnection() {
    self.isPresented = true
    if self.isConnected == true {
       self.dismiss(animated: true, completion: self.connectionEstablished)  
    }
}

Если время ожидания истекло, UIAlertView должен исчезнуть независимо от каких-либо состояний и заставить интерфейс BLE отключить периферийное устройство..

Отмена соединения

private final func cancelConnection() {
    self.bleTransceiver.disconnectPeripheral()
    self.resetDisconnectionFlags()
}

ВОПРОС

Следующая часть добавочного номера всегда вызывается после истечения времени ожиданияexpired.

DispatchQueue.main.asyncAfter(deadline: DispatchTime.now() + timeout!) {
    self.dismiss(animated: true, completion: timeoutActivity)
}

В iOS 12 функция завершения timeoutActivity: cancelConnection НЕ вызывается, если self.dismiss(animated: true, completion: self.connectionEstablished) вызывается раньше.

В iOS 13 функция завершения timeoutActivity: cancelConnection вызывается , даже если self.dismiss(animated: true, completion: self.connectionEstablished) вызывается раньше.

Может кто-нибудь сказать мне, что изменилось с iOS 12 на iOS 13 в этом контексте?

...