我是firebase的新手,我正在尝试实现iOS聊天应用。我想知道是否有办法在收到的消息中添加增量ID。
例如: 我将以下消息发送到firebase
{date: "2015-10-14T04:30:43", name: "Jacob" text:"Hi" userId: "y8jFdNwRAX" }
firebase是否可能向其添加messageId键
{msgId:1, date: "2015-10-14T04:30:43", name: "Jacob" text:"Hi" userId: "y8jFdNwRAX"};
如果我发送另一个消息,firebase会添加msgId并将其增加1:
{msgId:2, date: "2015-10-14T04:31:40", name: "Jacob" text:"morning" userId: "y8jFdNwRAX"};
不确定firebase是否可以这样做?任何帮助表示赞赏。提前谢谢。
答案 0 :(得分:6)
所以问题的答案是否定的,它不会发生在某种自动服务器端逻辑上。而且,这一般是一个坏主意。
有一些方法可以模拟一个计数器,但它可能真的很难处理,并且有很多方法可以出错,它只是不好的代码。
所以我建议寻找另一个解决方案:
也许每条消息都有一个跟踪它是否被读取的子节点?
message_id_1
timestamp: "2015-10-14T04:30:43"
name: "Jacob"
text: "Hi"
userId: "y8jFdNwRAX"
read: "yes"
message_id_2
timestamp: "2015-10-14T04:30:50"
name: "Bob"
text: "Hi Back At Ya"
userId: "y9jaksjk"
read: "no"
你甚至可以阅读'节点和未读的'节点
read_messages
message_id_1
timestamp: "2015-10-14T04:30:43"
name: "Jacob"
text: "Hi"
userId: "y8jFdNwRAX"
unread_messages
message_id_2
timestamp: "2015-10-14T04:30:50"
name: "Bob"
text: "Hi Back At Ya"
userId: "y9jaksjk"
这是一个棘手的问题:将消息存储在自己的节点中,并在用户节点中引用那些未读的消息
all_messages
message_id_1
timestamp: "2015-10-14T04:30:43"
from_userId: "y9jaksjk"
text: "This is message 1"
message_id_2
timestamp: "2015-10-14T04:30:50"
from_userId: "y9jaksjk"
text: "this is message 2"
users
"y8jFdNwRAX"
my_unread_messages:
message_id_1: true
(message_id_1:true保存为用户的子级是一个引用,指示该消息是针对该用户的,但尚未读取。读取时,删除引用。)
所有这些都是猜想,因为我们不知道应用的范围和消息的使用。
您可能希望更多地访问文档,并查看为其他选项提供的一些示例代码。
答案 1 :(得分:0)
如果有人有同样的问题。我使用时间戳作为" messageId"在服务器端跟踪订单(可能不是一个好主意,但它解决了我需要的东西),你可以创建' .indexon'在这个" messageId"在安全规则中获得更好的性能。
以下是安全规则的示例:
{
"rules": {
"Messages":{
"$Message":{
".indexOn": "messageId"
}
}
}
在iOS中设置代码:
msg[@"messageId"] = kFirebaseServerValueTimestamp;
请注意,Firebase可能存在错误:您从FEventTypeChildAdded收到的时间戳似乎与Firebase DB中保存的时间戳有所不同(几百ms差异)。
答案 2 :(得分:0)
由于其他原因,我遇到了同样的问题
递增的密钥可以通过交易来实现: https://www.firebase.com/docs/ios/api/#firebase_runTransactionBlock
swift的一个例子:
let messagesRef = ...
let counterRef = ... //you need to keep the count of messages
counterRef.runTransactionBlock({ (currentData) -> FTransactionResult! in
var value = currentData.value as? Int
if (value == nil) {value=0}
currentData.value = value! + 1
return FTransactionResult.successWithValue(currentData)
}) { (error, commited, snap) -> Void in
if error != nil {
print(error)
}
if commited {
//if increment is made set message
let messageInfo = ....
messagesRef.childByAppendingPath(snap.value).setValue(messageInfo)
}
如果唯一的目标是排序,那么childbyautoid函数就足够了,因为它会相应地创建密钥
messagesRef.childByAutoId().setValue(messageInfo)
希望这有助于某人