2017-07-07 44 views
0

Ich habe eine Chat-App. Ein Benutzer kann einen anderen Benutzer in der App auswählen, mit dem er chatten kann. Sobald ein Benutzer eine Nachricht an einen anderen Benutzer sendet, werden seine angehängten Nachrichten in einem Tabellenansicht-Controller angezeigt, und wenn Sie auf die Tabellenansichtszelle klicken, werden Sie in einen detaillierten Controller geleitet.löschen Tabellenansicht Zelle von 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 
    } 

Nur die zwei Benutzer im Chat können die Nachrichten anzeigen. Aber ich möchte, dass ein Benutzer die Tabellenansichtszelle in seiner App (den Nachrichten) löschen kann, aber wenn er das tut, löscht er in Firebase und das bedeutet, dass er auch in der App des anderen Benutzers löscht, aber ich möchte nur in der löschen Benutzer, der die Nachricht gelöscht hat. Hier ist, wie die Nachrichten angehängt werden, in dem Tableview Controller

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

       }}}) 

    } 

Antwort

4

angezeigt werden Wenn ein Update auf einen Firebase Realtime-Datenbank-Knoten gemacht wird, dann jeder Benutzer auf diesem Knoten lesen würde den gleichen Wert sehen (wenn die Sicherheitsregeln dem Benutzer erlauben, diesen Knoten zu lesen). Also, um Ihre Frage zu beantworten - Sie können nicht benutzerspezifische Updates zu einem Datenbankpfad machen.

auch sagen, dass in Ihrem Fall Sie eine der folgenden Möglichkeiten: -

  1. Sie löschen können, was Sie auf der Client-Seite zu löschen sind versucht, so dass es nicht sein länger sichtbar. Dies wird jedoch nicht die Daten in der Datenbank löschen und Sie würden es beim nächsten Download vom selben Pfad wieder sehen.

  2. Sie können separate Konversationspfade für beide Benutzer haben und die gleichen Nachrichten an diesen beiden Standorten statt an einem gemeinsamen speichern. In dieser Methode würden Sie Daten duplizieren. Wenn Sie jedoch benutzerspezifische Änderungen vornehmen möchten, würde dies mehr als für Sie tun.

+0

Wahl Nummer 1 ist die beste Option hier. OP sollte eindeutige Nachrichtencodes speichern. Diese eindeutigen Nachrichtencodes sollten unter der Benutzerdatei, die nur der Benutzer selbst lesen kann, und der Datenbank gespeichert werden. Wenn die eindeutigen Nachrichten (Datenbank & Karte) übereinstimmen -> Nachricht löschen (Clientseite natürlich :)). –

+0

@ J.Doe Es tut mir leid, aber meinst du nicht Wahl Nummer 2? –

Verwandte Themen