问题描述
我希望我的方法等到 Firebase 请求完成
I want my method to wait until Firebase request finished
uploadSingUpInfo
在 Firebase 请求完成之前返回,这对我来说是个问题 - 某些方法返回 nil.
uploadSingUpInfo
returns before the Firebase request finishes, and this is a problem for me - some method returns nil.
static func uploadSingUpInfo(fullName:String,email:String,password:String)->String{
rootRef = FIRDatabase.database().reference()
var returnVlue="not valid"
FIRAuth.auth()?.createUserWithEmail(email, password: password) { (user, error) in
if (error != nil){
returnVlue=(error?.userInfo["error_name"]) as! String
}
else{
let newUser = [
"username": fullName
]
rootRef.childByAppendingPath("User")
.childByAppendingPath((user?.uid)!).setValue(newUser)
NSUserDefaults.standardUserDefaults().setBool(true, forKey: "isLogin")
NSUserDefaults.standardUserDefaults().setObject(email, forKey: "email")
NSUserDefaults.standardUserDefaults().setObject(user?.uid, forKey: "user_ID")
print(NSUserDefaults.standardUserDefaults().objectForKey("user_ID"))
returnVlue="valid"
}
}
return returnVlue
}
推荐答案
不要将 Firebase 用作返回值的函数 - 这违背了它的异步性质.
Don't use Firebase as functions that return values - it goes against it's asynchronous nature.
规划允许 Firebase 执行其任务的代码结构,然后在闭包(块)内进入下一步.
Plan code structure that allows Firebase to perform it's task and then within the closure (block) go to the next step.
例如:在您的代码中,将函数更改为不返回任何内容,并在 createUserBlock 中,作为最后一行而不是返回,调用下一个函数来更新您的 UI.
For example: In your code, change the function to not return anything and within the createUserBlock, as the last line instead of return, call the next function to update your UI.
static func uploadSingUpInfo(fullName:String,email:String,password:String) {
rootRef = FIRDatabase.database().reference()
FIRAuth.auth()?.createUserWithEmail(email, password: password) { (user, error) in
if (error != nil){
showUserAnError(error)
} else {
let newUser = [
"username": fullName
]
rootRef.childByAppendingPath("User")
.childByAppendingPath((user?.uid)!).setValue(newUser)
NSUserDefaults.standardUserDefaults().setBool(true, forKey: "isLogin")
NSUserDefaults.standardUserDefaults().setObject(email, forKey: "email")
NSUserDefaults.standardUserDefaults().setObject(user?.uid, forKey: "user_ID")
print(NSUserDefaults.standardUserDefaults().objectForKey("user_ID"))
continueLoginProcess() //reload the ui or whatever step is next
}
}
}
这篇关于如何让应用程序等待 Firebase 请求完成的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!