gpt4 book ai didi

ios - 在闭包之外访问数据,Firebase ObserveSingleEvent//SWIFT

转载 作者:行者123 更新时间:2023-11-28 16:01:55 24 4
gpt4 key购买 nike

当我第一次问这个问题时,我还没有真正做过研究。但是在 20 多个小时之后,我的结构与 Firebase 文档中的结构完全一样。但是,我无法访问闭包之外的任何数据。这是应该写入数据的结构:

    struct UserStruct {
let name : String!
let age : String!
}

当它被调用时,数据库中的一切都被完美地写入,在闭包内部它不打印 nil,它确实打印了很明显的实际值。我已经试过了

    DispatchQueue.main.async {

}

但这也不起作用,有人指导我!感谢任何帮助,这是我与 Firebase 的最后一期。

     let currentUser = FIRDatabase.database().reference(withPath: "users").child((FIRAuth.auth()!.currentUser?.uid)!)
currentUser.observeSingleEvent(of: .value, with: { snapshot in
let value = snapshot.value as? NSDictionary
let name = value?["name"] as? String
let age = value?["age"] as? String
self.userAdded.insert(UserStruct(name: name, age: age), at: 0) // 1
let user = UserStruct.init(name: name, age: age) // 2

print("1 \(user.name)")
print("2 \(self.userAdded[0].name!)")
})

我写了两种获取数据的方法,第二个 (2) 是 Firebase 建议的方法,但我什至无法像使用 Struct 那样在更近的地方获取用户。

最佳答案

您在闭包中创建的 user 对象会在闭包完成它必须执行的操作时被释放。正如@Jay 在评论中所说,您需要将闭包中获取的数据存储在闭包的外部 变量中。一种快速而肮脏的测试方法是在您所在的类中创建一个变量,并将您在闭包中创建的 user 分配给该变量,然后打印出来以查看它是否有效:

//add a property in your class to store the user you get from Firebase
var retrievedUser: UserStruct?

let currentUser = FIRDatabase.database().reference(withPath: "users").child((FIRAuth.auth()!.currentUser?.uid)!)
currentUser.observeSingleEvent(of: .value, with: { snapshot in
let value = snapshot.value as? NSDictionary
let name = value?["name"] as? String
let age = value?["age"] as? String

let user = UserStruct.init(name: name, age: age)

//assign the user retrieved from Firebase to the property above
self.retrievedUser = user
//print the local copy of the retrived user to test that it worked
print(retrievedUser)
})

关于ios - 在闭包之外访问数据,Firebase ObserveSingleEvent//SWIFT,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40904141/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com