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

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

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

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

最佳答案

无论哪种方式,您都在运行完成处理程序;如果你得到一个错误返回,你正在调用它,但是你失败了并用 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)
    }
}

关于swift - 从线程/GCD/完成处理程序返回,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53357285/

相关文章:

iphone - 获取当前调度队列?

ios - 如何取消 iOS 中的完成处理程序

ios - iOS 13 Beta 版本中的应用程序启动时应用程序崩溃

ios - Core Plot 2.1 固定Y轴

ios - 异步连接完成处理程序中 dispatch_async 死锁的可能性

ios - 当主线程针对另一个调度队列发出 dispatch_sync 时,主队列/主线程会发生什么?

swift - 通过 self 更新闭包内的 UI 是一种不好的做法吗?

uiview - 嵌套闭包不喜欢参数列表

Swift:当我将参数传递给函数时,函数是复制参数还是使用对该参数的引用

json - 可选值的包装问题