2017-07-07 65 views
0

我有一个聊天应用程序。用户可以选择应用中的其他用户与之聊天。一旦用户将消息发送给其他用户,他们附加的消息就会显示在一个表格视图控制器中,当您单击表格视图单元格时,您将被关联到一个详细的控制器中。从Firebase删除表格视图单元格

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)} 
        } 

       }}}) 

    } 

回答

4

如果更新到火力地堡实时数据库节点做出,则任何用户读取该节点上会看到相同的值(如果安全规则允许用户读取该节点)。因此,要回答您的问题 - 您无法真正地将用户特定的更新到数据库路径。

说了这么多,你的情况,你可以做以下之一: -

  1. 可以删除你想删除在客户端什么,所以它不会是再也看不见了。但是,这不会删除数据库中的数据,并且在下次从相同路径下载时再次看到它。

  2. 您可以为两个用户分别创建对话路径,并将相同的消息存储在这两个位置中,而不是常见的一个。在这种方法中,你会复制数据。但是如果你想进行特定于用户的更改,那么这不仅仅是为你做。

+0

选择编号1是这里最好的选择。 OP应该存储唯一的消息代码。该唯一的消息代码应存储在仅由用户自己可读取的用户文件和数据库下。如果唯一的消息(数据库和地图)匹配 - >删除消息(客户端的课程:))。 –

+0

@ J.Doe我很抱歉,您是不是要选择2号? –