Swift 如何更快地显示来自Firebase的数据?

Swift 如何更快地显示来自Firebase的数据?,swift,firebase,firebase-realtime-database,Swift,Firebase,Firebase Realtime Database,我有来自Firebase的标签和数据。我需要得到数据,计数并更新标签。但我有问题。我得到数据的时间比我开始计数的时间晚 let uid = Auth.auth().currentUser?.uid let ref = Database.database().reference() ref.child("users").child(uid!).child("weight").observe(.value) { (snapshot) in s

我有来自Firebase的标签和数据。我需要得到数据,计数并更新标签。但我有问题。我得到数据的时间比我开始计数的时间晚

 let uid = Auth.auth().currentUser?.uid
        let ref = Database.database().reference()
        ref.child("users").child(uid!).child("weight").observe(.value) { (snapshot) in
            self.userWeight = snapshot.value as! Float
            print(self.userWeight)
        }
我应该数一数,然后显示出来

self.maxAmountOfWater = (self.userWeight * 4) / 100
maxWaterLabel.text = String(maxAmountOfWater)
Label的值为0,因为我获取数据的速度很慢。
我在viewDidLoad中完成所有操作。数据是从Firebase异步加载的,因为从服务器/网络下载可能需要一些时间。加载数据时,主应用程序代码将继续运行。一旦数据可用,就会调用完成处理程序

因此,任何需要数据库数据的代码都必须在完成处理程序中,或者从那里调用。把它放在任何其他地方都会使数据在代码需要时加载变得不确定

例如:

let uid = Auth.auth().currentUser?.uid
let ref = Database.database().reference()
ref.child("users").child(uid!).child("weight").observe(.value) { (snapshot) in
    self.userWeight = snapshot.value as! Float
    print(self.userWeight)

    self.maxAmountOfWater = (self.userWeight * 4) / 100
    maxWaterLabel.text = String(maxAmountOfWater)
}
回调中没有使用self.userWeight,因此一旦加载该值,它就可以访问数据库中的值

如果需要,还可以定义自己的完成处理程序,然后从Firebase完成处理程序中调用该处理程序,或者使用调度组。有关这方面的一些示例,请参见:

编辑:

请注意,Firebase闭包中的UI更新是在主线程上调用的。例如,如果在闭包中加载tableView数据源,也可以在闭包中调用tableView.reloadData,而无需使用调度组或其他线程