我刚开始学习swift 3而且我来自.NET背景。 我无法使用我的应用程序使用firebase对用户进行身份验证。我试图创建一个通用函数,然后调用另一个Firebase函数。
let user = logIn(email: email, password: password)
if user != nil{
self.navigationController?.pushViewController(MainVC(), animated: true)
}
func logIn(email: String,password: String) -> Firebase.User? {
var loginUser:Firebase.User?
Auth.auth().signIn(withEmail: email, password: password) { (user, error) in
if(error != nil){
print(error!)
return
}
if let firebaseUser = user {
loginUser = firebaseUser
}
}
if let user = loginUser{
return user
}
else {
return nil
}
}
在我的调试过程中,我发现 Auth.auth()。signIn 函数被跳过而没有被某些人执行,并返回null。但是,当我再次运行应用程序时,我发现firebase验证了我的用户!
答案 0 :(得分:0)
问题是signIn
是异步函数,需要一些时间才能执行。这意味着当您调用logIn
函数时,在signIn能够为您登录之前,您的else { return nil}
会执行,并且返回的值为零。
你不应该从这个函数返回,你应该做的是使用回调:所以用这个替换你的函数头。
func logIn(email: String,password: String, callback: @escaping (Firebase.User?) -> ()) {
删除功能中的最后一个if
因为您不需要它,所有内容都将在signIn
块中处理。
将signIn
块内的代码替换为:
if error != nil {
print(error!)
callback(nil)
}
if let firebaseUser = user {
callback(firebaseUser)
}
现在您必须将调用logIn
函数的方式更改为:
logIn(email: yourEmail, password: yourPassword) { (firebaseUser: Firebase.User?) in
// Your result is saved in firebaseUser variable
}
整个代码
// CALL LOGIN FUNCTION
logIn(email: yourEmail, password: yourPassword) { (firebaseUser: Firebase.User?) in
// Your result is saved in firebaseUser variable
if firebaseUser != nil{
self.navigationController?.pushViewController(MainVC(), animated: true)
}
}
// LOGIN FUNCTION
func logIn(email: String,password: String, callbacK: @escaping (Firebase.User?) -> ()) {
Auth.auth().signIn(withEmail: email, password: password) { (user, error) in
if error != nil {
print(error!)
callback(nil)
}
callback(firebaseUser)
}
}
我还没有对此进行过测试,所以也许你必须做一些小修改,但这是正确的做法。我希望你明白这一点。