Возврат из потоков / 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
от истинного блока.