ios - 使用 Firebase 检索的数据设置变量

标签 ios swift firebase asynchronous firebase-authentication

我正在尝试从 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/

相关文章:

json - 反序列化 double 组

ios - 来自 IOS Xcode 的 Azure 推送通知错误

ios - 无法使用类型为 'enumerate' 的参数列表调用 '(String)'

ios - Firebase AuthUI - 查找现有用户还是新用户

Firebase 的日期与时间戳

ios - IBAction 中的 If Else 语句 - iOS

ios - 你如何在 tableview 中对部分进行分组?

ios - 如何在Swift中从关联数组获取UIColor

ios - 使用内容类型应用程序/JSON iOS 未获得 JSON 响应

javascript - 火力地堡错误 :The photoURL field must be a valid URL