我正在创建一个聊天应用程序,我有一个表格视图单元格中两个用户之间发送的所有消息的列表。例如,我在两个用户之间总共有四个文本,因此我有四个单元格。但是,我想将单元格分组,以便我只有一个单元格,因为我只登录用户只与一个人通信。无论我做什么,消息都不会附加。
func loadData(){
if (FIRAuth.auth()?.currentUser) != nil{
FIRDatabase.database().reference().child("messages").observeSingleEvent(of: .value, with: { (snapshot:FIRDataSnapshot) in
let loggedInUserData = snapshot
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]
if let receiver = info["ReceiverId"] {
print("\(id): \(receiver)")
self.messages.Array(value)
}
}
self.MessageTableView.reloadData()
}
}})}
}
我认为问题出在self.messages.Array(value)
我只需要在同一个用户之间添加消息但我无法找到正确的代码
这就是我的手机的样子:
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "MessageCell", for: indexPath) as! MessageTableViewCell
//Configure the cell
print(messages[indexPath.row])
let message = self.messages[indexPath.row] as! [String: AnyObject]
if let seconds = message["timestamp"] as? Double {
let timeStampDate = NSDate(timeIntervalSince1970: seconds)
let dateFormatter = DateFormatter()
dateFormatter.dateFormat = "hh:mm a"
cell.Time.text = dateFormatter.string(from: timeStampDate as Date)
}
cell.Message.text = message["text"] as? String
// cell.SellerName.text = message["ReceiverId"] as? String
if let imageName = message["ReceiverId"] as? String {
let ref = FIRDatabase.database().reference().child("posts").child(imageName)
ref.observeSingleEvent(of: .value, with: { (snapshot)
in
if let dictionary = snapshot.value as? [String: AnyObject]{
for post in dictionary {
let messages = post.value as! [String: AnyObject]
for (id, value) in messages {
cell.SellerName.text = messages["username"] as? String
if (messages["uid"] as? String) != nil {
let uidPoster = messages["uid"] as? String
let imageRef = FIRStorage.storage().reference().child((uidPoster)!+"/profile_pic.jpg")
imageRef.data(withMaxSize: 25 * 1024 * 1024, completion: { (data, error) -> Void in
if error == nil {
let image = UIImage(data: data!)
cell.UserPic.image = image
cell.UserPic.layer.cornerRadius = 30
cell.UserPic.clipsToBounds = true
}else {
print("Error downloading image:" )
}})}
self.messages.add(value)
}
}
}
})
}
return cell
}
我的firebase消息路径是:
FIRDatabase.database()参考()子("消息&#34)。子("!(self.convoId)&#34)。childByAutoId()
答案 0 :(得分:1)
我将在答案中使用一个非常简单的例子。
给定结构
messages
msg_0
rec: "uid_0"
send: "uid_1"
msg: "msg from uid_0 to uid_1"
msg_1
rec: "uid_1"
send: "uid_0"
msg: "msg from uid_1 to uid_0"
向消息节点添加一个查询观察器,以查看具有rec:of uid_0的任何新消息(.childAdded)。
var messagesArray = [String]()
func watch() {
let messagesRef = self.ref.child("messages")
let queryRef = messagesRef.queryOrdered(byChild: "rec").queryEqual(toValue: "uid_0")
queryRef.observe(.childAdded, with: { snapshot in
let msgDict = snapshot.value as! [String: Any]
let msg = msgDict["msg"] as! String
self.messagesArray = [] //erases the array
self.messagesArray.append(msg) //adds this new message at index 0
print(self.messagesArray) //print is just for example
//normally call tableView.reloadData() which will refresh
// the cells in the tableView and display just once cell with
// the latest message in it
})
}
您可以通过将快照或字典存储在数组中来进行推断,以便您知道消息文本,并可以使用send:user id来查找发送消息的人。
如果运行此代码,输出将是发送到uid_0的任何新消息;仅显示最新消息。如果你有一个带有messagesArray的tableView,因为它是dataSource(通常是它的完成方式),那么tableView将被刷新并且只显示uid_0的最新消息。
作为旁注,.queryLimited(toLast :)可以在这里使用得很好。
答案 1 :(得分:0)
1)我认为,在你的情况下你应该.queryLimited(toLast:1)给每个聊天的消息。如果细节打开 - 加载其他消息。
2)但我有一个假设,你有错误的数据库结构。 Check this
在这里,您可以找到firebase doc的作者用于聊天的数据库的良好结构。
此外,您还可以查看制作聊天应用的旧片段:Link
希望有所帮助