我正在尝试从 Firebase 的异步函数中检索数据,然后将其设置为 ViewController 的用户变量:
var user : User!
override func viewDidLoad() {
super.viewDidLoad()
collectionView.dataSource = self
fetchUser()
}
func fetchUser(){
Api.User.observeCurrentUser { (user) in
self.user = user
}
问题是,在“observeCurrentUser”方法的括号内,我实际上可以看到正确检索到的用户,但在它们之外,它与 self.user 没有关联,当我尝试在括号外打印它时,它是零。
话虽这么说,但我在网上搜索了一下,发现这是因为它是一个异步函数。 如何让 self.user 等于在“observeCurrentUser”函数中检索到的用户,以便我可以在 ViewController 中处理它?</p>
Api.User.observeCurrentUser 函数检索当前用户。 它是这样编码的:
func observeCurrentUser(completion: @escaping (User)-> Void){
guard let currentUser = Auth.auth().currentUser else {
return
}
REF_USERS.child(currentUser.uid).observeSingleEvent(of: .value) { (snapshot) in
if let dict = snapshot.value as? [String: Any]{
let user = User.transformUser(dict: dict)
completion(user)
}
}
}
其中 REF_USERS 是 Firebase 数据库中所有用户的引用
最佳答案
在闭包之外,观察请求还没有完成。正确的方法是对检索到的用户执行您需要执行的所有操作——包括更新 UI——在闭包中。
func fetchUser(){
Api.User.observeCurrentUser { (user) in
self.user = user
// alternatively, add this line to the user setter. but for now...
self.updateUIBecauseTheUserChanged()
}
}
func updateUIBecauseTheUserChanged() {
// change the UI, e.g. reloadData on the collection view
}
关于ios - 使用 Firebase 检索的数据设置变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58891898/