2017-09-16 6 views
1

나는 이해할 수없는 행동이 있습니다. firebase database에있는 노드를 삭제하고 .value를 관찰하는 동안 계속 데이터를 수신합니다. 그러나 firebase 데이터베이스에서는 노드가 삭제됩니다.Firebase에서 여전히 데이터를 삭제했습니다.

노드가 users_shoppinglists입니다. 다음은 관찰 할 사용자 노드의 ID입니다. 그런 다음 모든 ID를 반복하여 관찰하고 각 ID를 관찰하는 함수를 호출합니다.

목록을 삭제해야 할 때 shoppinglists 노드에서 status 노드를 업데이트하고 클라우드 기능을 통해이 목록에 관련된 모든 데이터를 삭제합니다.

그러나 관찰 중에도 데이터가 수신됩니다. 완전히 삭제되기 전에 다시 데이터를받는 것 같습니다.

으로 반복 모든 아이디의 :

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

          }) 

         }) 

        }) 

       })) 

      }) 

     }) 

    } 

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

답변

0

은 시뮬레이터에서이 문제를했다. 그것은 .value뿐만 아니라 .childRemoved와 .childChanged도 전혀 트리거되지 않았습니다 (.childAdded 만 작동했습니다).

iPhone을 사용해 보았는데 효과가있었습니다. 그런 다음 "Erase All Content And Settings ..."를 Simulator에 보내고 시뮬레이터에서 다시 작업하기 시작했습니다.

내 생각에 코드에서 관찰자를 추가하거나 제거하고 아마도 데이터베이스의 구조를 변경하는 동안 firebase 캐시가 개발 중에 더러워지며 어떤 시점에서 적절하게 반응하지 않게됩니다.

관련 문제