简单的问题。如果我在完成 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/