2016-03-20 43 views
5

Semplice domanda. Se sono all'interno di un blocco di completamento, ad esempio l'accesso a Facebook tramite Firebase ... e l'accesso è riuscito. Se voglio eliminare il controller di visualizzazione corrente (login viewcontroller) dal blocco di completamento, devo tornare alla coda principale per farlo. Suppongo che il blocco di completamento del login sia stato eseguito su un thread in background e che qualsiasi modifica all'interfaccia utente (ovvero l'eliminazione del controller di visualizzazione corrente) debba essere eseguita sul thread principale ... qual è la procedura migliore qui ... o mi manca qualcosa ?Swift - per chiudere il controller della vista da un blocco di completamento

@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

stesso problema la mia risposta su performSegue: http://stackoverflow.com/questions/32292600/swift-performseguewithidentifier-not-working/32 292706 # 32292706 – BaseZen

+3

Devi farlo sul thread principale. – ryantxr

risposta

9

si dovrebbe "tornare" al thread principale per farlo. La sua piuttosto semplice, basta avvolgere

self.dismissViewControllerAnimated(true, completion: nil) come questo ...

in 2.x Swift

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

SWIFT 3:

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