代码之家  ›  专栏  ›  技术社区  ›  user7804097

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

  •  1
  • user7804097  · 技术社区  · 6 年前

    我有一些逻辑可以从登录屏幕登录用户。如果登录失败,我想显示一条消息让用户知道。如果用户成功登录,我将触发一个segue。当我用无效凭证测试它时,错误警报会按预期显示,但即使它嵌套在if-else语句中,仍会触发segue。为什么会这样?我怎样才能从里面出来,避开其他街区……?我尝试在DispatchHQ/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 回复  |  直到 6 年前
        1
  •  4
  •   Ben Gottlieb    6 年前

    不管是哪种方式,您都在运行完成处理程序;如果您返回一个错误,您将调用它,但随后您将失败并以零运行它。试试这个:

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

    }

        2
  •  0
  •   Ken Thomases    6 年前

    你的 login 函数调用 completionHandler 两次出现错误。这个 if 归结为以下语句。您应该在 else 阻止,或 return 从真正的街区。