ios - Swift - 从完成 block 中解散 View Controller

标签 ios swift authentication uiviewcontroller closures

简单的问题。如果我在完成 block 内 - 例如使用 firebase 的 facebook 登录......并且登录成功。如果我想从完成 block 中关闭当前 View Controller (登录 View Controller ),我是否需要返回主队列来执行此操作。我假设登录完成 block 是在后台线程上完成的,对 UI 的任何更改(即关闭当前 View Controller )都应该在主线程上完成……这里的最佳实践是什么……或者我错过了什么?

@IBAction func facebookLoginTapped(sender: AnyObject) {

    //
    let ref = Firebase(url: "https://XXXX.firebaseio.com")
    let facebookLogin = FBSDKLoginManager()
    facebookLogin.logInWithReadPermissions(["email"], fromViewController: self, handler: { (facebookResult, facebookError) -> Void in
        if facebookError != nil {
            print("Facebook login failed. Error \(facebookError)")
        } else if facebookResult.isCancelled {
            print("Facebook login was cancelled.")
        } else {
            //successfully logged in
            //get facbook access token
            let accessToken = FBSDKAccessToken.currentAccessToken().tokenString
            //use access token to authenticate with firebase
            ref.authWithOAuthProvider("facebook", token: accessToken,
                withCompletionBlock: { error, authData in
                    if error != nil {
                        print("Login failed. \(error)")
                    } else {
                        //authData contains
                        print("Logged in! \(authData)")

                        //pop loginvc back to uservc - DO I NEED TO GET MAIN THREAD HERE BEFORE DISMISSING VIEW CONTROLLER
                        self.dismissViewControllerAnimated(true, completion: nil)
                    }
            })
        }
    })
}

最佳答案

您应该“弹出”回主线程来执行此操作。很简单,就是包起来

self.dismissViewControllerAnimated(true, completion: nil) 像这样...

swift 2.x

dispatch_async(dispatch_get_main_queue()){
    self.dismissViewControllerAnimated(true, completion: nil)
}

swift 3 4 和 5:

DispatchQueue.main.async {
      self.dismiss(animated: true, completion: nil)
}

关于ios - Swift - 从完成 block 中解散 View Controller ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36120307/

相关文章:

ios - GRMustache 在过滤器中传递常量值?

ios - 从自定义类更新 UIProgressView 出现错误可选展开

ios - Alamofire 仅在运行存档应用程序时崩溃

authentication - Firefox-OS 中的 SSL/TLS 相互认证

ios - Twilio iOS 客户端 - 在后台保持活跃

swift - iWatch 中的 NSLocalizedString

ios - 尝试隐藏选项卡栏 SwiftUI 时出现问题

swift - 使用不存在的 rawValue 初始化的枚举不会失败并返回 nil

api - 设计 RESTful 身份验证 API

PHP setcookie 函数不保存 cookie?