【发布时间】:2016-08-16 21:24:59
【问题描述】:
我正在我的 iOS 应用中实现聊天逻辑 1-1。我正在使用 firebase 在聊天中存储聊天和消息。消息工作得很好。但是我对聊天列表有一些困难。 我的存储聊天结构如下所示
-Users
--UserID
---chatrooms
----chatroomID
-----updatedTime
-----deleted
-----read
-----receiverID
-----receiverName
我存储在 NSUserDefaults NSDate 值“chatsLoadedTime”中。我通过发送查询来查询聊天:
var time: String?
if defaults.valueForKey("chatsLoadedTime") != nil {
time = "\(defaults.valueForKey("chatsLoadedTime") as! NSDate)"
}
chatsRef.queryOrderedByChild("createdTime").queryStartingAtValue(time).observeEventType(.Value, withBlock: { snap in
defaults.setValue(toLocalTime(NSDate()), forKey: "chatsLoadedTime")
and so on
.
.
.
据我所知,这是一种存储聊天记录并能够从不同设备下载聊天记录的好方法。例如,我刚刚安装了应用程序,我的 chatsLoadedTime 值为 nil,然后我下载所有聊天并将此值更新为当前 dateTime。如果创建了新聊天,则其 createdTime 大于我的 chatsLoadedTime 值,应用程序将下载它。
但我不知道如何实现删除聊天的好方法。我想要这个逻辑:如果 user1 删除聊天,那么他只需更改他的值 delete=true。如果第二个用户也删除了他身边的这个聊天,那么聊天和消息将从应用程序中完全删除。如果 user1 删除了聊天,但 user2 没有删除,那么如果 user2 写信给 user1,那么 user1 会收到这条消息以及之前的所有消息,因为消息没有被删除。但也许这不是最好的逻辑。请给我一个建议,如何以最好的方式做到这一点。
如果可以的话,我想查询多个值,但据我所知这是不可能的。
【问题讨论】:
-
除了删除之外,似乎一切都按照您的意愿进行?您可以在每个 UserID 中添加一个 deletedChats 节点。删除聊天时,将 chatroomID: true 写入每个用户的 UserId/deletedChat 节点。当另一个用户删除聊天时,查询该节点的聊天室 ID,如果存在,则完全删除聊天。如果没有,则设置 chatroomID: true
-
似乎很长。如果 user1 删除了聊天,但随后 user2 写入 user1 怎么办。然后我需要发送查询,接收快照,检查 user2 是否有一个 deletedChat 节点。如果他有,那么我必须删除这个节点,如果没有,那就写吧。
-
也许我已经创建了解决方案。我稍后会回答:)
-
您甚至不需要查询,只需执行一个 observeSingleEventOfType ,因为您知道特定的节点名称 - 这是相当低的开销。另一个简单的解决方案是,如果用户 2 写入聊天,则设置 UserId/deletedChats/chatroomID = nil。如果存在,它将被 Firebase 删除,因为它是 nil,如果不存在,则不会发生任何事情。
-
也许您知道如何更改查询起始值?例如,我发送这样的查询:chatsRef.queryOrderedByChild("updatedTime").queryStartingAtValue(time).observeEventType(.Value, withBlock: { snap in 在查询中我将时间更改为另一个值,我该如何更新查询?跨度>
标签: ios swift firebase chat firebase-realtime-database