Как упоминал Дуг в своем ответе, Firebase является асинхронным, и данные действительны только в замыкании после вызова функции. Чтобы эти данные стали действительными, требуется время, поэтому любой код вне вызова функции после замыкания будет вызываться до того, как код внутри замыкания.
Так что это означает для твоего кода
Auth.auth().signIn(withEmail: userEmail, password: userPassword) { [weak self] authResult, error in
//this code will execute *after* the code that displays success
}
//this code will execute *before* the code within the closure following the signIn
self.displayAlertMessage(alertTitle: "Success"
Вот пример кода, который обрабатывает ошибки и обеспечивает правильную последовательность для потока кода.
Auth.auth().signIn(withEmail: user, password: pw, completion: { (auth, error) in
if let x = error {
let err = x as NSError
switch err.code {
case AuthErrorCode.wrongPassword.rawValue:
print("wrong password")
case AuthErrorCode.invalidEmail.rawValue:
print("invalued email")
case AuthErrorCode.accountExistsWithDifferentCredential.rawValue:
print("accountExistsWithDifferentCredential")
default:
print("unknown error: \(err.localizedDescription)")
}
} else {
if let _ = auth?.user {
print("authd") //user is auth'd proceed to next step
} else {
print("authentication failed - no auth'd user")
}
}
})