ios – Swift – 从完成块中解除视图控制器

前端之家收集整理的这篇文章主要介绍了ios – Swift – 从完成块中解除视图控制器前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
简单的问题.如果我在一个完成块内 – 例如使用firebase登录facebook …并且登录成功.如果我想从完成块中解除当前视图控制器(登录视图控制器),我是否需要返回主队列才能执行此操作.我假设登录完成块正在后台线程上完成,并且对UI的任何更改(即解雇当前视图控制器)应该在主线程上完成…这里最好的做法是什么……或者我错过了什么?
  1. @IBAction func facebookLoginTapped(sender: AnyObject) {
  2.  
  3. //
  4. let ref = Firebase(url: "https://XXXX.firebaseio.com")
  5. let facebookLogin = FBSDKLoginManager()
  6. facebookLogin.logInWithReadPermissions(["email"],fromViewController: self,handler: { (facebookResult,facebookError) -> Void in
  7. if facebookError != nil {
  8. print("Facebook login Failed. Error \(facebookError)")
  9. } else if facebookResult.isCancelled {
  10. print("Facebook login was cancelled.")
  11. } else {
  12. //successfully logged in
  13. //get facbook access token
  14. let accessToken = FBSDKAccessToken.currentAccessToken().tokenString
  15. //use access token to authenticate with firebase
  16. ref.authWithOAuthProvider("facebook",token: accessToken,withCompletionBlock: { error,authData in
  17. if error != nil {
  18. print("Login Failed. \(error)")
  19. } else {
  20. //authData contains
  21. print("Logged in! \(authData)")
  22.  
  23. //pop loginvc back to uservc - DO I NEED TO GET MAIN THREAD HERE BEFORE DISMISSING VIEW CONTROLLER
  24. self.dismissViewControllerAnimated(true,completion: nil)
  25. }
  26. })
  27. }
  28. })
  29. }

解决方法

你应该“弹出”回主线程来做到这一点.它非常简单,只需包裹

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

Swift 2.x

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

Swift 3&斯威夫特4:

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

猜你在找的iOS相关文章