打印结果
["data1"]
["data1", "data2"]
["data1", "data2", "data3"]
...
想要的结果只是包含所有数据的最后一个打印数组,或者只是获取最后一个数组可以帮助我
["data1", "data2", "data3"]
这是我用来从firebase获取数据的代码
var dataArray = [String]()
func fetchFirebaseData(){
var datref: DatabaseReference!
datref = Database.database().reference()
datref.child("Data").observe(.childAdded, with: { (snapshot) in
if let dictionary = snapshot.value as? [String: AnyObject]{
let data = SpeisekarteInfos(dictionary: dictionary)
data.setValuesForKeys(dictionary)
self.dataArray.append(data.Name!)
print(self.dataArray)
}
}, withCancel: nil)
}
答案 0 :(得分:0)
您正在观察.childAdded
个事件,这些事件将被重复调用,一次针对数据库中的每个条目。我没有使用过FireBase,但基于一点谷歌搜索,听起来你应该反而观察.value
事件,然后重构你的代码以期望所有这些事件。像这样:
var dataArray: [String]?
func fetchFirebaseData(){
dataArray = []
var datref: DatabaseReference!
datref = Database.database().reference()
datref.child("Data").observe(.value, with: { (snapshot) in
for item in snapshot.children {
if let dictionary = item as? [String: AnyObject]{
let data = SpeisekarteInfos(dictionary: dictionary)
data.setValuesForKeys(dictionary)
self.dataArray.append(data.Name!)
}
}
print(self.dataArray)
}, withCancel: nil)
}
我正在对你从.value调用中获取的数据的格式做一些猜测,所以我不肯定上面的内容会起作用,但它至少应该指向正确的方向。
请注意,在我的版本中,我们使用.value观察者一次请求所有内容,然后循环遍历返回的所有子节点,将它们构建为数组,并且只有在它们全部返回后才打印该数组。
从我正在阅读的内容看来,每次更新数据库时,都会使用所有元素调用.value
观察者。如果您的数据库是动态的,这将不是一个好方法。