Ios 与Swift和Firebase的聊天应用程序逻辑

Ios 与Swift和Firebase的聊天应用程序逻辑,ios,swift,firebase,chat,firebase-realtime-database,Ios,Swift,Firebase,Chat,Firebase Realtime Database,我正在iOS应用程序中实现聊天逻辑1-1。我正在使用firebase在聊天中存储聊天和消息。信息非常有效。但我对聊天列表有一些困难。 我存储的聊天结构如下所示 -Users --UserID ---chatrooms ----chatroomID -----updatedTime -----deleted -----read -----receiverID -----receiverName 我存储在NSUserDefaults NSDate值“chatsLoadedTime”中。我通过发送

我正在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
.
.
.
据我所知,这是一种存储聊天记录并能够从不同设备下载聊天记录的好方法。例如,我刚刚安装了该应用程序,我的聊天记录时间值为零,然后我下载所有聊天记录并将该值更新为当前日期时间。如果创建了新聊天室,则其createdTime大于my chatsLoadedTime值,应用程序将下载该聊天室

但我不知道如何实现一个好的和有效的方式来删除聊天。我想要这样的逻辑:如果user1删除聊天,那么他只需更改其值deleted=true。如果第二个用户也删除了他身边的聊天记录,那么该聊天记录和消息将从应用程序中完全删除。如果user1删除了聊天,但user2没有删除,那么如果user2向user1写入,则user1会收到此消息和所有以前的消息,因为消息没有被删除。但也许这不是最好的逻辑。请给m一个建议,如何以最好的方式做到这一点


如果可以,我想查询多个值,但据我所知,这是不可能的。

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

似乎除了删除之外,一切都正常工作?您可以在每个用户标识中添加deletedChats节点。删除聊天时,为每个用户UserId/deletedChat节点写入聊天室id:true。当其他用户删除聊天时,向该节点查询聊天室ID,如果该ID存在,则完全删除该聊天室。如果没有,那么设置聊天室ID:TrueT似乎很长。如果user1删除了聊天记录,但user2向user1写入了内容,该怎么办。然后我需要发送查询,接收快照,检查user2是否有deletedChat节点。如果他有,那么我必须删除这个节点,如果没有,那么就写。也许我已经创建了解决方案。我稍后会回答:)您甚至不需要查询,只需执行observeSingleEventOfType,因为您知道特定的节点名称-这是相当低的开销。另一个简单的解决方案是,如果用户2向聊天室写入内容,则设置UserId/deletedChats/chatroomID=nil。如果它存在,它将被Firebase删除,因为它为零,否则将不会发生任何事情。也许您知道如何更改查询起始值?例如,我发送如下查询:chatsRef.queryOrderedByChild(“updatetime”).queryStartingAtValue(time).observeEventType(.Value,withBlock:{管理单元和内部查询我将时间更改为另一个值,如何更新查询?您能在回答中共享您的代码吗?太好了!那是很久以前的事了,不幸的是,我没有代码了