ios - closure - Swift: descartando el controlador de vista desde dentro de un bloque de finalización
swift completion functions (1)
Pregunta simple. Si estoy dentro de un bloque de finalización, por ejemplo, inicio de sesión en facebook usando firebase ... y el inicio de sesión ha tenido éxito. Si deseo cerrar el controlador de vista actual (iniciar sesión en el controlador de visualización) desde el bloque de finalización, ¿necesito volver a la cola principal para hacer esto? Supongo que el bloque de finalización de inicio de sesión se realiza en un hilo de fondo y cualquier cambio en la IU (es decir, descartando el controlador de vista actual) debe hacerse en el hilo principal ... ¿qué es mejor práctica aquí? O ¿me estoy perdiendo algo? ?
@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)
}
})
}
})
}
deberías "pop" volver al hilo principal para hacer esto. Es bastante simple, solo envuelve
self.dismissViewControllerAnimated(true, completion: nil)
como este ...
en Swift 2.x
dispatch_async(dispatch_get_main_queue()){
self.dismissViewControllerAnimated(true, completion: nil)
}
SWIFT 3:
DispatchQueue.main.async {
self.dismiss(animated: true, completion: nil)
}