对于聊天应用程序,我遵循Firebase指南structuring data。他们建议如下所示的结构。为Firebase中的聊天应用程序构造数据
{
// Chats contains only meta info about each conversation
// stored under the chats's unique ID
"chats": {
"one": {
"title": "Historical Tech Pioneers",
"lastMessage": "ghopper: Relay malfunction found. Cause: moth.",
"timestamp": 1459361875666
},
"two": { ... },
"three": { ... }
},
// Conversation members are easily accessible
// and stored by chat conversation ID
"members": {
// we'll talk about indices like this below
"one": {
"ghopper": true,
"alovelace": true,
"eclarke": true
},
"two": { ... },
"three": { ... }
},
// Messages are separate from data we may want to iterate quickly
// but still easily paginated and queried, and organized by chat
// converation ID
"messages": {
"one": {
"m1": {
"name": "eclarke",
"message": "The relay seems to be malfunctioning.",
"timestamp": 1459361875337
},
"m2": { ... },
"m3": { ... }
},
"two": { ... },
"three": { ... }
}
}
如何构建我的用户数据,这样我可以很容易地显示所有他们的部分聊天记录的列表,并为他们的每一个显示的最后一条消息和时间戳。如果我做了以下结构:
"users": {
"ghopper": {
"name": "Gary Hopper",
"chats": {
"one: true",
"two": true
}
},
"alovelace" { ... }
},
我可以轻松地获得每个聊天组列表针对特定用户,例如ghopper,这样做(在SWIFT):
ref.child("users").child("ghopper").child("chats").observeSingleEventOfType(.Value, withBlock: { (snapshot) in
//do something with data
}
但是我赢了此快照中没有lastMessage和时间戳记。我需要做什么来访问这些数据?
- 为每个用户复制所有这些数据?即添加用户/ ghopper /聊天/ one/{“lastMessage”:“ghopper:发现中继故障原因:飞蛾。”,“时间戳”:1459361875666}
- 为每个聊天记录查询“chats/specificGroupId”用户是(添加多个listners)的一部分?
- 还有其他的一些方法吗?
因为您没有使用该变量,lastMesssage = snapshot的功能是什么?另外,在块中使用self.variable名称是最好的做法(闭包)。另外,第一个ref.child中的ref.child是重复的,所以它会读取相同的数据。最大的问题是Firebase是异步的,并且紧密的for循环将比观察块内的数据可以返回的方式运行快得多,所以我认为我们遇到了一些数据完整性问题 - 可能应该让Firebase做到这一点'东西'异步。 – Jay
要回答您的答案....不,不需要uid_2:false,因为它不存在,它可能默认为false(取决于它的编码)。不,数据库不会呈指数增长。如果你有10个用户和1个聊天,那么所有10个用户都在聊天,所以唯一增长的将是聊天中的用户节点(在我的答案中),如果你有1000个用户和100个聊天,每个聊天与两个用户,那仍然只有100个聊天,每个聊天都有一个有两个用户的用户节点。即使有1000个用户和1000个聊天记录,这也不算大量的数据。 – Jay