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)}
}
}}})
}
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 :)). –
@ J.Doe Es tut mir leid, aber meinst du nicht Wahl Nummer 2? –