1

我有一些逻辑可以从登录屏幕登录用户。如果登录失败,我想显示一条消息让用户知道。如果用户登录成功,我会触发一个 segue。当我使用无效凭据对其进行测试时,错误警报会按预期显示,但即​​使它嵌套在 if-else 语句中,segue 仍会被触发。为什么是这样?我怎样才能退出它并避免 else 块......?我尝试在 DispatchQ/show alert 代码下添加“return”,但没有任何效果。

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

2 回答 2

4

无论哪种方式,您都在运行完成处理程序;如果你得到一个错误,你正在调用它,但你会失败并以 nil 运行它。尝试这个:

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

}

于 2018-11-18T03:03:38.450 回答
0

在错误情况下,您的login函数调用completionHandler了两次。if落入以下陈述。您应该将以下语句放在一个else块中,或者return从真正的块中。

于 2018-11-18T03:03:30.247 回答