完成处理程序在Swift中的Firebase观察者
问题描述:
我正在为将返回对象列表的函数创建一个完成处理程序。当它第一次返回值时,它运行良好。但是,当任何更改发生在firebase数据库中,并且再次观察被调用时,数组大小会增加一倍。为什么它会翻倍?完成处理程序在Swift中的Firebase观察者
func getStadiums(complition: @escaping ([Stadium]) -> Void){
var stadiums: [Stadium] = []
let stadiumRef = Database.database().reference().child("Stadium")
stadiumRef.observe(.value, with: { (snapshot) in
for snap in snapshot.children {
guard let stadiumSnap = snap as? DataSnapshot else {
print("Something wrong with Firebase DataSnapshot")
complition(stadiums)
return
}
let stadium = Stadium(snap: stadiumSnap)
stadiums.append(stadium)
}
complition(stadiums)
})
}
,并呼吁像这样
getStadiums(){ stadiums
print(stadiums.count) // count gets doubled up after every observe call
}
答
您使用的代码在观察者之外声明stadiums
。这意味着无论何时对数据库引用的值进行更改,您都会将数据追加到stadiums
而不清除之前的内容。确保在再次追加快照之前从stadiums
中删除数据:
func getStadiums(complition: @escaping ([Stadium]) -> Void){
var stadiums: [Stadium] = []
let stadiumRef = Database.database().reference().child("Stadium")
stadiumRef.observe(.value, with: { (snapshot) in
stadiums.removeAll() // start with an empty array
for snap in snapshot.children {
guard let stadiumSnap = snap as? DataSnapshot else {
print("Something wrong with Firebase DataSnapshot")
complition(stadiums)
return
}
let stadium = Stadium(snap: stadiumSnap)
stadiums.append(stadium)
}
complition(stadiums)
})
}
答
此行stadiumRef.observe(.value, with: { (snapshot) in ...
实际添加将被调用每次你的球场数据被更改的观察员。
因为你把它叫做两次通过getStadiums(){ stadiums ...
,增加了总的观察者将是2
这使得在第二个电话打了两次电话线路stadiums.append(stadium)
。
我的建议是使用stadiumRef.observe()
而不是从getStadiums()
调用它。
Thanks @Jen :)它真的有效 –