Firebase已删除数据

时间:2017-09-16 11:04:29

标签: firebase firebase-realtime-database google-cloud-functions

我有一种我无法理解的行为。 我在firebase database上删除了一个节点,在观察.value期间我仍然收到数据。但是在firebase数据库中,该节点将被删除。

我有一个名为users_shoppinglists的节点。以下是要观察存储的用户节点的所有ID。然后我迭代所有的id来观察并调用一个观察每个ID的函数。

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

但观察期间仍然收到数据。我似乎在完全删除之前再次收到数据。

迭代所有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(() => {

                            })

                        })

                    })

                }))

            })

        })

    }

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

1 个答案:

答案 0 :(得分:0)

在Simulator上遇到此问题。它不仅仅是.value而且.childRemoved和.childChanged根本没有被触发(只有.childAdded正在工作)。

尝试在iPhone上运行。然后我制作了#34;删除所有内容和设置......"到模拟器,它也开始在模拟器上再次工作。

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