我知道这个问题已经在堆栈溢出上被问过好几次了,但我似乎找不到我正在寻找的答案。我正在尝试将 firebase 数据库中的数据(使用observeSingleEvent(snapshot))方法存储在全局变量中。详情请参阅下面的代码。
我尝试添加完成处理程序并按照在线步骤进行操作,但这样做后,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 并填充全局(即类变量)用户的代码
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: "")!
所以你可能想用某种默认图像填充它,或者在它为零的情况下提供错误处理。
关于ios - 如何将 Firebase 异步请求的数据保存在全局变量中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56010642/