2016-03-20 3 views
5

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

@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

Тот же вопрос, как мой ответ about performSegue: http://stackoverflow.com/questions/32292600/swift-performseguewithidentifier-not-working/32 292706 # 32292706 – BaseZen

+3

Вы должны сделать это на главной теме. – ryantxr

ответ

9

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

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

в Swift 2.x

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

СВИФТ 3:

DispatchQueue.main.async { 
     self.dismiss(animated: true, completion: nil) 
} 
Смежные вопросы