Firebase删除的数据仍然存在

Firebase删除的数据仍然存在,firebase,firebase-realtime-database,google-cloud-functions,Firebase,Firebase Realtime Database,Google Cloud Functions,我有一种我无法理解的行为。 我在firebase数据库上删除了一个节点,但在观察过程中仍会收到数据。但在firebase数据库中,节点被删除 我有一个名为users\u shoppinglist的节点。下面是要观察存储的所有用户节点的id。然后我迭代所有id以观察并调用观察每个id的函数 当我需要删除一个列表时,我会更新shoppinglists节点上名为status的节点,并通过云函数删除所有与此列表相关的数据 但在观察期间仍会收到数据。似乎在数据完全删除之前,我又收到了数据 迭代所有id:

我有一种我无法理解的行为。 我在
firebase数据库上删除了一个节点
,但在观察过程中仍会收到数据。但在firebase数据库中,节点被删除

我有一个名为
users\u shoppinglist
的节点。下面是要观察存储的所有用户节点的id。然后我迭代所有id以观察并调用观察每个id的函数

当我需要删除一个列表时,我会更新
shoppinglists
节点上名为
status
的节点,并通过云函数删除所有与此列表相关的数据

但在观察期间仍会收到数据。似乎在数据完全删除之前,我又收到了数据

迭代所有id:

func ObserveAllList() -> Void{

    if currentUser == nil { return }

    self.ShowActivityIndicator()
    ref.child("users_shoppinglists").child(currentUser!.id!).observe(.value, with: { (usersListsSnap) in

        if usersListsSnap.value is NSNull { self.HideActivityIndicator(); return }

        for listSnap in usersListsSnap.children {

            let list = listSnap as! DataSnapshot

            self.ObserveSingleList(listID: list.key)

        }

    }) { (error) in

        NSLog(error.localizedDescription)
        let title = String.OnlineFetchRequestError
        let message = error.localizedDescription
        self.ShowAlertMessage(title: title, message: message)
        return

    }


}
调用函数观察每个ID:

func ObserveSingleList(listID:String) -> Void {

    self.ShowActivityIndicator()
    ref.child("shoppinglists").child(listID).observeSingleEvent(of: .value, with: { (snapshot) in

        if snapshot.value is NSNull { self.HideActivityIndicator(); return }


        //Read listData
        var newList = ShoppingList()
        newList.id = snapshot.key
        newList.name = snapshot.childSnapshot(forPath: "listName").value as? String
        newList.owneruid = snapshot.childSnapshot(forPath: "owneruid").value as? String
        newList.relatedStore = snapshot.childSnapshot(forPath: "relatedStore").value as? String

        //Read List items
        self.ref.child("listItems").child(listID).observe(.value, with: { (itemSnap) in

            var newItems = [ShoppingListItem]()
            for items in itemSnap.children {

                let item = items as! DataSnapshot
                var newItem = ShoppingListItem()
                newItem.id = item.key
                newItem.listID  = listID
                newItem.isSelected = item.childSnapshot(forPath: "isSelected").value as? Bool
                newItem.itemName = item.childSnapshot(forPath: "itemName").value as? String
                newItem.sortNumber = item.childSnapshot(forPath: "sortNumber").value as? Int
                newItems.append(newItem)

            }
            newList.items = newItems

            //Read List members
            self.ref.child("shoppinglist_member").child(listID).observe(.value, with: { (memberSnap) in

                var newMembers = [ShoppingListMember]()
                for members in memberSnap.children {

                    let member = members as! DataSnapshot
                    var m = ShoppingListMember()
                    m.memberID = member.key
                    m.status = member.value as? String
                    newMembers.append(m)

                }
                newList.members = newMembers

                DispatchQueue.main.async {

                    if let index = allShoppingLists.index(where: { $0.id == listID }){

                        allShoppingLists[index] = newList

                    } else {

                        allShoppingLists.append(newList)

                    }

                    self.HideActivityIndicator()
                    NotificationCenter.default.post(name: Notification.Name.ShoppingBuddyListDataReceived, object: nil, userInfo: nil)

                }


            }, withCancel: { (error) in

                self.HideActivityIndicator()
                NSLog(error.localizedDescription)
                let title = String.OnlineFetchRequestError
                let message = error.localizedDescription
                self.ShowAlertMessage(title: title, message: message)
                return

            })

        }, withCancel: { (error) in

            self.HideActivityIndicator()
            NSLog(error.localizedDescription)
            let title = String.OnlineFetchRequestError
            let message = error.localizedDescription
            self.ShowAlertMessage(title: title, message: message)
            return

        })


    }) { (error) in

        self.HideActivityIndicator()
        NSLog(error.localizedDescription)
        let title = String.OnlineFetchRequestError
        let message = error.localizedDescription
        self.ShowAlertMessage(title: title, message: message)
        return

    }
}
云功能:

    //****************************************************************************************************************/
// Handles an action when status value changed in users_shoppinglists node
//****************************************************************************************************************/
exports.handle_ListStatusUpdate = functions.database.ref('/shoppinglists/{listID}').onUpdate(event => {

    var listData = event.data.val()
    console.log('Status', listData.status)

    //handle deleted by owner
    if (String(listData.status) == 'deleted by owner') {

        //Get all members to delete the list on their users_shoppinglists node
        return admin.database().ref('shoppinglist_member').child(event.params.listID).once('value').then(listMember => {

            var promises = []
            listMember.forEach(function (member) {

                promises.push(admin.database().ref('users_shoppinglists').child(member.key).child(event.params.listID).set(null).then(() => {

                    return admin.database().ref('shoppinglist_member').child(event.params.listID).set(null).then(() => {

                        // delete the original shopping list
                        return admin.database().ref('shoppinglists').child(event.params.listID).set(null).then(() => {

                            return admin.database().ref('listItems').child(event.params.listID).set(null).then(() => {

                            })

                        })

                    })

                }))

            })

        })

    }

});/*********************************************************************************************************** */

在模拟器上有这个问题。它不仅是.value,而且根本没有触发.childRemoved和.childChanged(只有.childAdded起作用)

在iPhone上试用,效果不错。然后我对模拟器做了“擦除所有内容和设置…”,它也开始在模拟器上工作

我敢打赌,firebase缓存在开发过程中会变脏,而您在代码中添加或删除观察器,可能会更改数据库的结构,在某个时候它会停止相应的反应