functions closure ios swift login uiviewcontroller closures

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) }