2016-03-20 40 views
5

Proste pytanie. Jeśli jestem w bloku kończącym - na przykład facebook login przy użyciu firebase ... i logowanie się powiodło. Jeśli chcę odrzucić bieżący kontroler widoku (login viewcontroller) z bloku zakończenia, czy muszę wrócić do głównej kolejki, aby to zrobić. Zakładam, że blok kończenia logowania jest wykonywany na wątku tła, a wszelkie zmiany w interfejsie użytkownika (tj. Zwalnianie bieżącego kontrolera widoku) powinny być wykonywane na głównym wątku ... co jest najlepszą praktyką tutaj ... czy też brakuje mi czegoś ?Swift - zwalnianie kontrolera widoku z poziomu bloku zakończenia

@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

sam problem jak moją odpowiedź o performSegue: http://stackoverflow.com/questions/32292600/swift-performseguewidentidentifier-not-working/32 292706 # 32292706 – BaseZen

+3

Musisz to zrobić w głównym wątku. – ryantxr

Odpowiedz

9

powinieneś "pop" wrócić do głównego wątku, aby to zrobić. Jego dość prosta, wystarczy owinąć

self.dismissViewControllerAnimated(true, completion: nil) tak ...

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