2016-03-20 19 views
5

简单的问题。如果我在完成块内 - 例如使用firebase进行Facebook登录...并且登录成功。如果我想从完成块中关闭当前的视图控制器(登录视图控制器),是否需要返回主队列来执行此操作。我假设登录完成块正在后台线程完成,任何改变到用户界面(即解散当前视图控制器)应该在主线程上完成...这里最好的做法...或者我错过了什么?Swift - 从完成块中解散视图控制器

@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) 
        } 
      }) 
     } 
    }) 
} 
+0

同样的问题我的回答关于performSegue:http://stackoverflow.com/questions/32292600/swift-performseguewithidentifier-not-working/32 292706#32292706 – BaseZen

+3

您必须在主线程上执行此操作。 – ryantxr

回答

9

你应该“弹出”回主线程来做到这一点。它很简单,只是包装

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

斯威夫特2.X

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

SWIFT 3:

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