【问题标题】:Chat app logic with Swift and Firebase使用 Swift 和 Firebase 聊天应用逻辑
【发布时间】: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


【解决方案1】:

我为每个聊天室添加了updatedTime 值。我为设备添加了一个名为lastLoadedTime 的值。每次我从 firebase 收到快照时,我都会将 lastLoadedTime 更新为当前时间。因此,我观察到聊天,其中存储在设备上的时间值小于 firebase 的 chatRoom 中的updatedTime。当我删除聊天时,我将更新时间设置为1990-01-01 00:00:00。所以在有人给我发消息之前我不会观察这个聊天。询问我是否需要更多信息来理解:)

【讨论】:

  • 您能在答案中分享您的代码吗?会很棒!
  • 那是很久以前的事了,不幸的是我没有代码了
猜你喜欢
  • 2017-06-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-10-06
  • 1970-01-01
相关资源
最近更新 更多