我在我的应用程序中使用Firebase的实时数据库。我从数据库中提取数据并进行一些更改,然后我删除工作不正常的观察器。
我在实时数据库中有一些数据,如下所示:
我使用firebase的observe(.value)函数来获取这个值,然后更新一个条目,然后删除observer。
func updatePoints() {
let firebaseId = UserDefaults.standard.value(forKey: "firebaseId") as? String ?? ""
let reference = self.database.child("Points").child(firebaseId)
var handler : UInt = 0
handler = reference.observe(.value, with: { snapshot in
guard let userPoints = snapshot.value as? [String : Any] else {
print("no points data found")
return
}
let pointsLeft = userPoints["points_left"] as? Int ?? 0
reference.child("points_left").setValue(pointsLeft - 1)
reference.removeObserver(withHandle: handler)
})
}
现在的问题是,这个观察器运行两次。例如,如果**“points_left”:10**,那么在这个函数之后,剩下的点将有8值,但它应该有9。它运行了两次,我不明白为什么它会这样做,因为我正在使用removeObserver。有人能帮助我吗?
1条答案
按热度按时间2vuwiymt1#
上述意外行为的原因是您调用的
setValue
函数正在触发数据库中的另一个.value
事件,然后它再次触发观察器。因此,在您删除观察器时,它已经触发了两次。这导致点数减少2而不是1。所以如果你把最后两行互换了,在你调用
setValue
函数的时候,observer已经被移除了,所以它不会被第二次触发。