Возврат из потоков / GCD/ обработчик завершения

У меня есть логика, чтобы войти в систему с экрана входа в систему. Если вход в систему не удается, я хочу показать сообщение, чтобы пользователь знал. Если пользователь входит в систему успешно, я запускаю переход. Когда я проверяю его с неверными учетными данными, предупреждение об ошибке отображается, как и ожидалось, но переход по-прежнему запускается, даже если он вложен в оператор if-else. Почему это? Как я могу выйти из него и избежать блока else...? Я попытался добавить 'return' под кодом оповещения DispatchQ/ show, но это не имело никакого эффекта.

self.login(username: usernameTextField.text!, password: passwordTextField.text!) { (error) in
        if error != nil {
            DispatchQueue.main.async {
                self.showAlert(msg: error ?? "error")
            }
        } else {
            DispatchQueue.main.async {
                // segue code
            }
        }
    }

авторизоваться:

func login(username: String, password: String, completionHandler: @escaping (_ error: String?) -> ()) {
    SessionHelper.shared.logUserIn(withUsername: username, andPassword: password) { (error) in
        if let err = error {
            completionHandler(err)
        }
        completionHandler(nil)
    }
}

2 ответа

Решение

Вы запускаете обработчик завершения в любом случае; если вы получите ошибку назад, вы вызываете ее, но затем вы проваливаетесь и запускаете ее с нулем. Попробуй это:

func login(username: String, password: String, completionHandler: @escaping (_ error: String?) -> ()) {
SessionHelper.shared.logUserIn(withUsername: username, andPassword: password) { (error) in
    if let err = error {
        completionHandler(err)
    } else {
        completionHandler(nil)
    }
}

}

Ваш login вызовы функций completionHandler дважды в случае ошибки. if проваливается до следующего утверждения. Вы должны либо поместить следующее утверждение в else блок или return от истинного блока.

Другие вопросы по тегам