从线程/GCD/完成处理程序返回
Returning from threading/ GCD/ completion handler
我有一些逻辑可以让用户从登录屏幕登录。如果登录失败,我想显示一条消息让用户知道。如果用户成功登录,我会触发 segue。当我使用无效凭据对其进行测试时,错误警报会按预期显示,但即使嵌套在 if-else 语句中,segue 仍会被触发。为什么是这样?我怎样才能 return 摆脱它并避免 else 块......?我尝试在 DispatchQ/ 显示警报代码下添加 '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)
}
}
您的 login
函数在错误情况下调用了 completionHandler
两次。 if
落入以下语句。您应该将以下语句放在 else
块中,或者将 return
放在真正的块中。
无论哪种方式,您都在 运行 完成处理程序;如果你得到一个错误返回,你正在调用它,但是你失败了并且 运行 它为 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)
}
}
}
我有一些逻辑可以让用户从登录屏幕登录。如果登录失败,我想显示一条消息让用户知道。如果用户成功登录,我会触发 segue。当我使用无效凭据对其进行测试时,错误警报会按预期显示,但即使嵌套在 if-else 语句中,segue 仍会被触发。为什么是这样?我怎样才能 return 摆脱它并避免 else 块......?我尝试在 DispatchQ/ 显示警报代码下添加 '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)
}
}
您的 login
函数在错误情况下调用了 completionHandler
两次。 if
落入以下语句。您应该将以下语句放在 else
块中,或者将 return
放在真正的块中。
无论哪种方式,您都在 运行 完成处理程序;如果你得到一个错误返回,你正在调用它,但是你失败了并且 运行 它为 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)
}
}
}