2016-10-08 3 views
2
@IBAction func loginEmailButton(sender: AnyObject) { 
     FIRAuth.auth()?.signInWithEmail(email.text!, password: password.text!, completion: { (user, error) in 
      if error != nil { 
       if let errCode = FIRAuthErrorCode(rawValue: error!.code) { 
        switch errCode { 
        case .ErrorCodeInvalidEmail: 
         self.emailLoginStatus = "invalid email" 
        case .ErrorCodeUserDisabled: 
         self.emailLoginStatus = "User account disabled" 
        case .ErrorCodeWrongPassword: 
         self.emailLoginStatus = "Wrong Password" 
        case .ErrorCodeUserNotFound: 
         self.emailLoginStatus = "User not found" 
        case .ErrorCodeNetworkError: 
         self.emailLoginStatus = "Could not connect" 
        default: 
         self.emailLoginStatus = "Login Error" 
        } 
       } 
      }else{ 
       self.emailLoginStatus = "Logged" 
      } 
     }) 

     if self.emailLoginStatus == "Logged"{ 
      self.performSegueWithIdentifier("emailLoginToSearchSegue", sender: self) 
     }else{ 
      showAlert(emailLoginStatus) 
     } 

} 

Я отлаживать шаг за шагом кода, и это ситуация: Когда я нажимаю на loginEmailButton в первый раз, электронная почта и пароль параметры устанавливаются к функции signInWithEmail, но эта функция не выполняется (следующий этап отладки идет непосредственно из функции без запуска блока завершения).Swift - Firebase функция signInWithEmail не выполняет в первом вызове

Затем симулятор отображает предупреждение без текста, но если я закрою предупреждение и снова коснусь loginEmailButton, то signInWithEmail будет выполнен правильно и отобразит предупреждение с правильным сообщением. Я даже попробовал обновить модули Firebase, но проблема все еще остается.

Любое предложение? Благодаря!

ответ

2

Его асинхронная проблема. signInWithEmail делает асинхронный вызов на сервер, что означает, что этот вызов будет загружен в другом сетевом потоке, и это займет некоторое время, но поскольку ваш performSegueWithIdentifier помещен вне завершающего блока, он будет выполнен даже до того, как будет выполнен входной знак , но при нажатии кнопки ваш следующий раз, когда пользователи были ранее подписаны в с первого звонка, так что это перетекает ...

Просто поместите

self.performSegueWithIdentifier("emailLoginToSearchSegue", sender: self) 

внутри signInWithEmail completionBlock().

@IBAction func loginEmailButton(sender: AnyObject) { 
    FIRAuth.auth()?.signInWithEmail(email.text!, password: password.text!, completion: { (user, error) in 
     if error != nil { 
      if let errCode = FIRAuthErrorCode(rawValue: error!.code) { 
       switch errCode { 
       case .ErrorCodeInvalidEmail: 
        self.emailLoginStatus = "invalid email" 
       case .ErrorCodeUserDisabled: 
        self.emailLoginStatus = "User account disabled" 
       case .ErrorCodeWrongPassword: 
        self.emailLoginStatus = "Wrong Password" 
       case .ErrorCodeUserNotFound: 
        self.emailLoginStatus = "User not found" 
       case .ErrorCodeNetworkError: 
        self.emailLoginStatus = "Could not connect" 
       default: 
        self.emailLoginStatus = "Login Error" 
       } 
      } 
     }else{ 
      self.performSegueWithIdentifier("emailLoginToSearchSegue", sender: self) 
     } 
    }) 
} 
+0

Accept (галочка в левом верхнем углу моего ответа), это как ответ, если он решил проблему :) Happy Coding – Dravidian

+0

Дравидских, ваш ответ имеет смысл, спасибо, но я уже пробовал раньше, но безуспешно. Если я помещаю функцию performSegueWithIdentifier в функцию signInWithEmail и нажимаю кнопку «Вход», сеанс запускается без проверки ошибок signInWithEmail. Это происходит потому, что функция signInWithEmail по-прежнему не выполняется в первом вызове, и теперь эта функция скрывает функцию executeSegueWithIdentifier – Enzo

+0

Но если err == nil, то зачем ему нужно проверять ошибки? – Dravidian

Смежные вопросы