Ios 从Firebase中删除表视图单元格

Ios 从Firebase中删除表视图单元格,ios,swift,uitableview,firebase,firebase-realtime-database,Ios,Swift,Uitableview,Firebase,Firebase Realtime Database,我有一个聊天应用程序。用户可以在应用程序中选择其他用户进行聊天。一旦用户向另一个用户发送消息,他们附加的消息将显示在表视图控制器中,当您单击表视图单元格时,您将进入详细控制器 override func didPressSend(_ button: UIButton!, withMessageText text: String!, senderId: String!, senderDisplayName: String!, date: Date!) { let convoRe

我有一个聊天应用程序。用户可以在应用程序中选择其他用户进行聊天。一旦用户向另一个用户发送消息,他们附加的消息将显示在表视图控制器中,当您单击表视图单元格时,您将进入详细控制器

  override func didPressSend(_ button: UIButton!, withMessageText text: String!, senderId: String!, senderDisplayName: String!, date: Date!) {
        let convoRef = FIRDatabase.database().reference().child("messages").child(convoId!)
        let itemRef = rootRef.child("messages").child(convoId!).childByAutoId() // 1
        let messageItem = [ // 2
            "senderId": senderId!,
            "ReceiverId": senderDisplayName!,
            "text": text!,
            "timestamp": NSDate().timeIntervalSince1970,
            "convoId": convoId!
            ] as [String : Any]

        itemRef.setValue(messageItem) // 3

        JSQSystemSoundPlayer.jsq_playMessageSentSound() // 4

        finishSendingMessage() // 5
        isTyping = false
    }
因此,只有两个正在聊天的用户才能查看消息。但我希望一个用户能够删除其应用程序(消息)中的表视图单元格,但当他们这样做时,它会在Firebase中删除,这意味着它也会在其他用户的应用程序中删除,但我希望它只在删除消息的用户中删除。下面是如何附加消息以显示在tableview控制器中

  func loadData()
    {

        FIRDatabase.database().reference().child("messages").observeSingleEvent(of: .value, with: { (snapshot:FIRDataSnapshot) in

            if let postsDictionary = snapshot .value as? [String: AnyObject] {

                for post in postsDictionary {
                    let messages = post.value as! [String: AnyObject]
                    for (id, value) in messages {
                        let info = value as! [String: AnyObject]


                        let convoId = info["convoId"]
                        let toId = info["ReceiverId"] as! String!
                        let fromId = info["senderId"] as! String!


                        if (toId == self.loggedInUserUid  || fromId == self.loggedInUserUid) {

        let ref = FIRDatabase.database().reference().child("messages").child(convoId as! String)
        ref.observe(.childAdded, with: { (snapshot) in



            if let dictionary = snapshot.value as? [String: AnyObject] {
                let message = Message(dictionary: dictionary)


                if let receiver = message.convoId {
                    self.messagesDictionary[receiver] = message

                    self.messages = Array(self.messagesDictionary.values)
                    print(self.messages)
                    self.messages.sort(by: { (message1, message2) -> Bool in


                        return (message1.timestamp?.int32Value)! > (message2.timestamp?.int32Value)!

                    })
                }

                //this will crash because of background thread, so lets call this on dispatch_async main thread
                DispatchQueue.main.async(execute: {
                    self.MessageTableView.reloadData()
                })
            }

        }, withCancel: nil)}
                    }

                }}})

    }

如果对Firebase实时数据库节点进行更新,则在该节点上读取的任何用户都将看到相同的值(如果安全规则允许用户读取该节点)。因此,为了回答您的问题,您不能真正对数据库路径进行特定于用户的更新

话虽如此,在您的情况下,您可以执行以下操作之一:-

  • 您可以在客户端删除要删除的内容,这样它就不再可见了。但是,这不会删除数据库中的数据,下次从同一路径下载时,您将再次看到它

  • 您可以为两个用户提供单独的对话路径,并在这两个位置(而不是公共位置)存储相同的消息。在这种方法中,您将复制数据。但是,如果您想进行特定于用户的更改,那么这不仅仅是为了您


  • 如果对Firebase实时数据库节点进行更新,则在该节点上读取的任何用户都将看到相同的值(如果安全规则允许用户读取该节点)。因此,为了回答您的问题,您不能真正对数据库路径进行特定于用户的更新

    话虽如此,在您的情况下,您可以执行以下操作之一:-

  • 您可以在客户端删除要删除的内容,这样它就不再可见了。但是,这不会删除数据库中的数据,下次从同一路径下载时,您将再次看到它

  • 您可以为两个用户提供单独的对话路径,并在这两个位置(而不是公共位置)存储相同的消息。在这种方法中,您将复制数据。但是,如果您想进行特定于用户的更改,那么这不仅仅是为了您


  • 选择1是这里的最佳选择。OP应存储唯一的消息代码。唯一的消息代码应该存储在用户文件(只有用户自己可以读取)和数据库下。如果唯一消息(数据库和地图)匹配->删除消息(客户端当然:)。@J.Doe我很抱歉,但你不是说选择2吗?选择1是这里最好的选择。OP应存储唯一的消息代码。唯一的消息代码应该存储在用户文件(只有用户自己可以读取)和数据库下。如果唯一消息(数据库和地图)匹配->删除消息(客户端当然:)。@J.Doe我很抱歉,但你不是说选择2吗?