ios - 其他功能获得价值但不是其他
问题描述
在我加载用户的函数中,我能够检索一个值。但是,当我想将它分配给函数外部的变量时,它什么都没有,如登录函数所示。
加载用户函数
func loadUser(userid: String) -> User {
//print(userid)
let userid = "56ldZFJiv0dpfaABzo78"
var user = User()
let docRef = db.collection("users").document(userid)
docRef.getDocument { (document, error) in
if let document = document {
let first = document.data()!["first"] as! String
let last = document.data()!["last"] as! String
let position = document.data()!["position"] as! String
let company = document.data()!["company"] as! String
let email = document.data()!["email"] as! String
let address = document.data()!["address"] as! String
let userID = document.data()!["userID"] as! String
//Initalize user
user = User(userID: userID,
firstName: first,
lastName: last,
company: company,
address: address,
position: position,
email: email)
print(user.position)
} else {
print("Document does not exist")
}
}
return user
}
登录功能
//MARK: LOGIN
func login() {
Auth.auth().signIn(withEmail: emailField.text!, password: passwordField.text!) { (user, error) in
if error == nil{
//self.performSegue(withIdentifier: "loginToAdmin", sender: self)
//Load user
let loggedOnUser = self.loadUser(userid: Auth.auth().currentUser!.uid)
print(loggedOnUser.userID)
// let storyBoard: UIStoryboard = UIStoryboard(name: "Main", bundle: nil)
// let chatViewController = storyBoard.instantiateViewController(withIdentifier: "chatVC") as! UINavigationController
// self.present(chatViewController, animated: true, completion: nil)
}
else {
DispatchQueue.main.async{
//Display Alert Message if login failed
let alertController = UIAlertController(title: "Error", message: error?.localizedDescription, preferredStyle: .alert)
let defaultAction = UIAlertAction(title: "OK", style: .cancel, handler: nil)
alertController.addAction(defaultAction)
self.present(alertController, animated: true, completion: nil)
}
}
}
}
对于第一个函数,我得到一个位置值,如 print 语句中所述。对于第二个函数,我的变量“loggedOnUser”为空。
解决方案
您需要loadUser
异步完成
func loadUser(userid: String,completion:@escaping(User?) ->()) {
//print(userid)
let userid = "56ldZFJiv0dpfaABzo78"
var user = User()
let docRef = db.collection("users").document(userid)
docRef.getDocument { (document, error) in
if let document = document {
let first = document.data()!["first"] as! String
let last = document.data()!["last"] as! String
let position = document.data()!["position"] as! String
let company = document.data()!["company"] as! String
let email = document.data()!["email"] as! String
let address = document.data()!["address"] as! String
let userID = document.data()!["userID"] as! String
//Initalize user
user = User(userID: userID,
firstName: first,
lastName: last,
company: company,
address: address,
position: position,
email: email)
print(user.position)
completion(user)
} else {
print("Document does not exist")
completion(nil)
}
}
}
称呼
self.loadUser(userid: Auth.auth().currentUser!.uid) { res in
if let user = res {
print(user)
}
}
推荐阅读
- numpy - numpy.delete 中的 MemoryError
- apache-spark - sparkposeexplode 在列中失败
- r - 斯皮尔曼相关 R
- mysql - MySQL 数据库:如何为多个表编写 SQL
- c# - 不要逃避新行
- c# - asp.net (4.x) 和quartz.net (3.0.7.0)quartz_jobs.xml 在Global.asax Application_Start 中调度
- r - 如何使用ggplot2将轴标签保留在一侧,将轴标题保留在另一侧
- ajax - Django + Ajax帖子:用户登录后403禁止
- javascript - 在 Angular 6 中导入时刻
- aes-gcm - AES-GCM 解密错误 iaik.cms.CMSException:无法解密加密的内容加密密钥:无效填充