gpt4 book ai didi

ios - 使用 Swift 更新 Firebase 中未读消息的数量

转载 作者:行者123 更新时间:2023-11-28 14:55:14 25 4
gpt4 key购买 nike

我正在尝试在我的应用中实现聊天功能。当一个用户向另一个用户发送消息时,我想将保存在 Firebase 中的“未读消息数”计数器加 1。

这是我的 Firebase 树:

Firebase Tree

字段“newMessage”是我有多少未读消息的计数器。“Messages”之后是 Contact ID(消息被发送到的那个),然后是 Sender ID(向这个联系人发送消息的那个),然后是“newMessage”是有多少条来自 Sender 的未读消息联系方式。

我写了这个函数来添加一个新的未读消息:

private func AddNewMsgTick(contactID: String)
{
let ref = Constants.refs.databaseChats.child(contactID).child(senderId)

ref.observe( .value, with: {(snapshot) in

let dataDic = snapshot.value as? NSDictionary

if let currentNewMsgs = dataDic!["newMessage"] as? Int
{
let newIntMsg = currentNewMsgs + 1
ref.setValue(newIntMsg) // This isn't right and should be updated
}

})
}

而且这段代码似乎不能正常工作。我已经尝试了几次迭代,使用 ref.observeSingleEvent,还尝试使用 .ChildAdd,现在我已经达到了我要尝试的迭代将快照转换为字典并从那里获取值。

我所有的函数迭代都失败了。我无法正确读取值并将其解析为 Int。它读取了错误的信息,如下所示:

Wrong information read

在聊天中按下“发送”按钮后激活的功能:

override func didPressSend(_ button: UIButton!, withMessageText text: String!, senderId: String!, senderDisplayName: String!, date: Date!)
{
Constants.refs.databaseChats.child(senderId).observeSingleEvent(of: .value, with: {(snapshot) in

if !snapshot.hasChild(self.contactID!)
{
self.CreateChatRoom(creatorID: senderId, creatorName: senderDisplayName, contactID: self.contactID!, contactName: self.contactDisplayName!)
}

let stringMsgPostedOn = Constants.GetCurrentDateTimeString()
let senderRef = Constants.refs.databaseChats.child(senderId).child(self.contactID!).child("Messages").child(stringMsgPostedOn)
let contactRef = Constants.refs.databaseChats.child(self.contactID!).child(senderId).child("Messages").child(stringMsgPostedOn)

let senderRefLite = Constants.refs.databaseChatsLite.child(senderId).child(self.contactID!)
let contactRefLite = Constants.refs.databaseChatsLite.child(self.contactID!).child(senderId)

let message = ["userID": senderId, "userName": senderDisplayName, "text": text]
let messageLite = ["userName": self.contactDisplayName, "lastMessage": text]

// Make all this one transaction
senderRef.setValue(message)
senderRefLite.setValue(messageLite)

contactRef.setValue(message)
contactRefLite.setValue(messageLite)
self.AddNewMsgTick(contactID: self.contactID!)
self.finishSendingMessage()


})


}

聊天室初始化:

private func CreateChatRoom(creatorID: String, creatorName: String ,contactID: String, contactName: String)
{
let infoForCreator = ["userName": contactName, "newMessage" : String(0)]
let infoForContact = ["userName": creatorName, "newMessage" : String(0)]



let childUpdates = ["Messages/\(creatorID)/\(contactID)/": infoForCreator,
"Messages/\(contactID)/\(creatorID)/": infoForContact,
"ChatRoomsLite/\(creatorID)/\(contactID)/": infoForCreator,
"ChatRoomsLite/\(contactID)/\(creatorID)/": infoForContact
]

Constants.refs.databaseRoot.updateChildValues(childUpdates)
}

实现这个功能的正确方法是什么?将不胜感激。

最佳答案

像这样重构您的 CreateChatRoom 函数:

    let infoForCreator = ["userName": contactName, "newMessage" : 0]
let infoForContact = ["userName": creatorName, "newMessage" : 0]

然后,尝试更改您的 AddNewMsgTick 以使用:

ref.observeSingleEvent

关于ios - 使用 Swift 更新 Firebase 中未读消息的数量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49452789/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com