从线程/ GCD /完成处理程序返回

时间:2018-11-18 02:06:15

标签: swift grand-central-dispatch completionhandler ios-multithreading

我有一些逻辑可以从登录屏幕登录用户。如果登录失败,我想显示一条消息让用户知道。如果用户成功登录,我会触发segue。当我使用无效的凭据对其进行测试时,错误警报将按预期显示,但是segue仍被触发,即使它嵌套在if-else语句中也是如此。为什么是这样?我该如何退出并避免else阻塞...?我尝试在DispatchQ / show警报代码下添加“ 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)
    }
}

2 个答案:

答案 0 :(得分: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)
    }
}

}

答案 1 :(得分:0)

在错误情况下,您的login函数两次调用completionHandlerif属于以下语句。您应该将以下语句放在else块中,或者将return从真实块中放入。