2017-09-16 1 views
1

J'ai un comportement que je ne peux pas comprendre. Je supprime un nœud sur firebase database et je reçois toujours les données pendant l'observation .value. Mais dans la base de données Firebase, le noeud est supprimé. J'ai un noeud appelé users_shoppinglists. Voici tous les identifiants des nœuds utilisateurs à observer stockés. Ensuite, j'itère tous les identifiants pour observer et appeler une fonction qui observe chaque ID.Firebase a supprimé les données encore là

Lorsque j'ai besoin de supprimer une liste, je mets à jour un nœud appelé status sur le nœud shoppinglists et supprime tous les données liées à cette liste via des fonctions de cloud.

Mais les données sont toujours reçues pendant l'observation. Il semble que je reçois à nouveau les données avant qu'elles ne soient complètement supprimées.

Iterate tous 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 

    } 


} 

fonction d'appel à chaque ID: observent

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 

    } 
} 

fonction Cloud:

//****************************************************************************************************************/ 
// 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(() => { 

          }) 

         }) 

        }) 

       })) 

      }) 

     }) 

    } 

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

Répondre

0

eu ce problème sur simulateur. Ce n'était pas seulement .value mais .childRemoved et .childChanged n'étaient pas du tout déclenchés (seul .childAdded fonctionnait).

Essayé sur iPhone et cela a fonctionné. Puis j'ai fait "Effacer tout le contenu et les paramètres ..." sur Simulator et cela a recommencé à fonctionner sur Simulator. Mon pari est que le cache de base de données est sale pendant le développement, alors que vous ajoutez ou supprimez des observateurs dans le code et changez probablement de structure dans la base de données et à un moment donné, il ne réagit plus correctement.