2016-04-23 78 views
3

我在我的iOS应用中实现聊天逻辑1-1。我正在使用Firebase将聊天和消息存储在聊天中。消息工作得很好。但我在聊天列表中遇到了一些困难。 我保存聊天记录的结构看起来像这样与Swift和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值为零,然后我下载了所有聊天记录,并将此值更新为当前日期时间。如果创建了新的聊天,那么它的createdTime会比我的chatsLoadedTime值更大,然后应用程序会下载它。

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

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

+0

看来,一切工作正如你想要的除了删除?您可以在每个用户ID中添加一个deletedChats节点。删除聊天时,请将chatroomID:true写入每个用户的UserId/deletedChat节点。当其他用户删除聊天时,请查询该聊天室节点是否存在,然后完全删除该聊天。如果没有,然后设置chatroomID:true – Jay

+0

它似乎很长。如果用户1删除聊天,但用户2写入用户1,会怎么样?然后我需要发送查询,接收快照,检查user2是否有一个deletedChat节点。如果他有,那么我必须删除这个节点,如果没有,那就写。 –

+0

也许我已经创建了解决方案。我会稍后回答:) –

回答

0

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

+0

你可以吗?在你的答案中分享你的代码?会很棒! – MJQZ1347