Swift-отклонение контроллера вида из блока завершения

простой вопрос. Если я нахожусь в блоке завершения - например, вход в facebook с помощью firebase ... и логин удался. Если я хочу уволить текущий контроллер представления (login viewcontroller) из блока завершения , мне нужно вернуться в главную очередь, чтобы сделать это. Я предполагаю, что блок завершения входа в систему выполняется в фоновом потоке, и любое изменение пользовательского интерфейса (т. е. отклонение текущего контроллера представления) должно быть сделано в основном потоке ... какова наилучшая практика здесь... или я что-то пропустила?

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

1 ответов


вы должны "поп" обратно в основной поток для этого. Его довольно просто, просто обернуть

self.dismissViewControllerAnimated(true, completion: nil) такой...

Swift 2.x

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

Swift 3 & Swift 4:

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