如何更快地显示Firebase中的数据?

时间:2019-05-26 14:10:50

标签: swift firebase firebase-realtime-database

我有Firebase的标签和数据。我需要获取数据,对其进行计数并更新Label。但是我有问题。我得到的数据晚于开始计数的数据。

 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

中完成了所有操作

1 个答案:

答案 0 :(得分:1)

数据是从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 Closure中的UI更新是在主线程上调用的。因此,例如,如果在闭包内加载tableView dataSource,则也可以在闭包内调用tableView.reloadData(),而不必使用调度组或其他线程。