【发布时间】:2019-05-06 18:35:26
【问题描述】:
我知道在堆栈溢出时已多次询问此问题,但我似乎无法找到我正在寻找的答案。我正在尝试将来自 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)
}
}
【问题讨论】:
-
self 是类还是结构?我们需要更多的上下文来理解这里的问题。如果 self 按值传递,您可能正在修改复制到块上下文中的第二个 self 实例,而不是原始引用。
-
self 只是来自班级。 user 定义为:var user: User!,这是我创建的一个包含上述变量的类。分配发生在覆盖 func viewDidLoad() { 函数中。我马上更新
标签: ios swift firebase asynchronous firebase-realtime-database