![](/img/trans.png)
[英]How to store data (into a global variable) retrieved from reverseGeocodeLocation() method (asynchronous task)?
[英]How to save data from firebase asynchronous request in a global variable?
我知道这已被问过堆栈溢出几次,但我似乎无法找到我正在寻找的答案。 我试图在全局变量中存储来自firebase数据库(使用observeSingleEvent(快照))方法的数据。 请参阅以下代码了解详情。
我已经尝试添加完成处理程序并在线执行了一些步骤,但是这样做,observeSingleEvent请求停止工作。
我之前的所作所为:
class ItemsTableViewController: UITableViewController {
let listToUsers = "ListToUsers"
var user: User!
let ref = Database.database().reference()
override func viewDidLoad() {
super.viewDidLoad()
let defaultUser = User()
ref.child("users").child(uid).observeSingleEvent(of: .value, with: { (snapshot) in
let value = snapshot.value as? NSDictionary
defaultUser.uid = uid
defaultUser.email = value?["email"] as? String ?? ""
defaultUser.name = value?["name"] as? String ?? ""
defaultUser.grad = value?["grad"] as? Int ?? 0
defaultUser.number = value?["number"] as? String ?? ""
defaultUser.image = UIImage(named: value?["image"] as? String ?? "")!
completion(defaultUser)
}) { (error) in
print("hello")
print(error.localizedDescription)
}
self.user = defaultUser
}
}
我尝试过但仍然无法工作:
class ItemsTableViewController: UITableViewController {
// MARK: Constants
let listToUsers = "ListToUsers"
// MARK: Properties
var user: User!
let ref = Database.database().reference()
override func viewDidLoad() {
super.viewDidLoad()
let use = Auth.auth().currentUser?.uid
self.getUserData(uid:use!) { (user) -> () in
self.user = user
}
}
func getUserData(uid:String , completion: @escaping (User) -> ()) {
ref.child("users").child(uid).observeSingleEvent(of: .value, with: { (snapshot) in
let value = snapshot.value as? NSDictionary
let defaultUser = User()
defaultUser.uid = uid
defaultUser.email = value?["email"] as? String ?? ""
defaultUser.name = value?["name"] as? String ?? ""
defaultUser.grad = value?["grad"] as? Int ?? 0
defaultUser.number = value?["number"] as? String ?? ""
defaultUser.image = UIImage(named: value?["image"] as? String ?? "")!
completion(defaultUser)
}){ (error) in
print("hello")
print(error.localizedDescription)
}
}
Firebase是异步的,第一个代码块中的self.user = defaultUser将在Firebase有机会返回数据之前被调用。
Firebase调用后,数据仅在关闭内有效。 所以这是如何解决它。 哦,并删除该错误代码,因为它不需要。
假设这样的用户结构
users
uid_0
name: "some name"
email: "some email"
以及在uid_0中读取并填充全局(即类var)用户的代码
class MyUser {
var uid = ""
var name = ""
var email = ""
init(aUid: String, aName: String, aEmail: String) {
self.uid = aUid
self.name = aName
self.email = aEmail
}
}
var user: MyUser!
func readOneUser() {
let uid = "uid_0"
let thisUserRef = self.ref.child("users").child(uid)
thisUserRef.observeSingleEvent(of: .value, with: { snapshot in
//let uid = snapshot.key if you don't know the uid, it will be the key to the node
let name = snapshot.childSnapshot(forPath: "name").value as? String ?? "No Name"
let email = snapshot.childSnapshot(forPath: "email").value as? String ?? "No Email"
self.user = MyUser(aUid: uid, aName: name, aEmail: email)
print(self.user.name) //do something with the user here
})
}
这条线
defaultUser.image = UIImage(named: value?["image"] as? String ?? "")!
需要解决,但我不知道目的是什么。 如果发生这种情况,最终可能会失败
defaultUser.image = UIImage(named: "")!
因此,您可能希望使用某种默认图像填充它,或者在它为零时提供错误处理。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.