Возврат из потока / GCD / обработчик завершения - PullRequest
0 голосов
/ 18 ноября 2018

У меня есть логика для входа пользователя с экрана входа в систему.Если вход в систему не удается, я хочу показать сообщение, чтобы пользователь знал.Если пользователь входит в систему успешно, я запускаю переход.Когда я проверяю его с неверными учетными данными, предупреждение об ошибке отображается, как и ожидалось, но переход по-прежнему запускается, даже если он вложен в оператор 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
            }
        }
    }

login:

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 ]

0 голосов
/ 18 ноября 2018

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

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)
    }
}

}

0 голосов
/ 18 ноября 2018

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

...