Firebase removeObserver无法在Swift 5中运行

i5desfxk  于 2023-02-16  发布在  Swift
关注(0)|答案(1)|浏览(112)

我在我的应用程序中使用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。有人能帮助我吗?

2vuwiymt

2vuwiymt1#

上述意外行为的原因是您调用的setValue函数正在触发数据库中的另一个.value事件,然后它再次触发观察器。因此,在您删除观察器时,它已经触发了两次。这导致点数减少2而不是1。
所以如果你把最后两行互换了,在你调用setValue函数的时候,observer已经被移除了,所以它不会被第二次触发。

相关问题