从Firebase数据库中读取数据的问题
问题描述:
好吧我从数据库中读取数据,并在打印出各个变量时正确输出。但是,好像数据拒绝追加到数组。有人知道为什么我根本弄不清楚。从Firebase数据库中读取数据的问题
let commuteBuilder = Commutes()
Database.database().reference().child("Users").child(user).child("Trips").observe(DataEventType.childAdded, with: { (snapshot) in
//print(snapshot)
if let dict = snapshot.value as? NSDictionary {
commuteBuilder.distance = dict["Distance"] as! Double
commuteBuilder.title = dict["TripName"] as! String
commuteBuilder.transportType = (dict["Transport"] as? String)!
}
commuteArray.append(commuteBuilder)
})
print("helper")
print(commuteArray.count)
return commuteArray
答
数据是正确添加到阵列中,只是没有在您打印数组的内容的时间。
如果改变这样的代码,你可以看到这一点:
let commuteBuilder = Commutes()
Database.database().reference().child("Users").child(user).child("Trips").observe(DataEventType.childAdded, with: { (snapshot) in
if let dict = snapshot.value as? NSDictionary {
commuteBuilder.distance = dict["Distance"] as! Double
commuteBuilder.title = dict["TripName"] as! String
commuteBuilder.transportType = (dict["Transport"] as? String)!
}
commuteArray.append(commuteBuilder)
print("added one, now have \(commuteArray.count)")
})
print("returning \(commuteArray.count)")
return commuteArray
你会看到它打印的是这样的:
返回0
增加了一个,现在有1
加了一个,现在有2个
等
这可能不是您所期望的输出。但它按预期工作。 Firebase异步加载数据库中的数据。它不会阻塞您的代码,而是让线程继续(因此用户可以继续使用该应用程序),而是在有新数据可用时调用回传递给observe
的代码块。
这意味着当这段代码返回数组时它仍然是空的,但它后来添加了项目。这意味着您不能以您尝试的方式从函数返回数据。
我觉得最容易改变我对代码的思考方式。而不是“首先获取数据,然后打印”,我将其设置为“开始获取数据,当数据返回时,将其打印出来”。
在上面的代码中,我通过将打印计数的代码移动到回调块的中。您也可以创建自己的回调,在Swift中称为完成处理程序或关闭。您可以在this article,this article,这个问题Callback function syntax in Swift或当然在Apple的文档中找到示例。
好吧,这对我来说更有意义,我明白为什么这可能会有用。我的问题是我以前设置我的代码来使用CoreData,在这种情况下,我正在调用旧数据并将其转储到具有此功能的数组中。那么现在我想为此使用firebase。我得到了如何使用它来填充说自动更新的表视图,但我也有用例,我想添加值(距离值)并输出总距离。 id知道要做的唯一方法是将其转储到数组中并执行求和功能。似乎我不能轻松地使用它们的异步类型函数。 –
你只需要做不同的事情。当你听'.child *'事件时,你可以保持一个正在运行的聚合:只是迄今为止的值的总和。或者,您可以查看'.value'事件,这会一次性为您提供所有子节点。只需迭代它们,并在每次更改时计算总和。请参阅https://firebase.google.com/docs/database/ios/lists-of-data#listen_for_value_events –