我有以下情况,我聊天并使用Firebase作为后端,我想找到解决下一个问题的最佳解决方案。如果群聊是打开的,则每个传入的消息都应具有发件人配置文件图像。聊天分为三种结构,即会话,用户对话和消息模型。消息模型仅包含senderID,因为我发现不建议存储profileImageURL,因为用户可以更改头像。我想到的第二个选项是将profileImageURL保存在Conversation模型中,当用户更改头像以使用云功能更改它时,这将起作用,但由于资源成本(例如,如果用户),这是一个非常糟糕的决定有300次对话,他每天都会改变头像。请告诉我,这种情况的最佳方法是什么?
消息模型
"-KmfKFxY2BsLjpGixowG" : {
"conversationID" : "-KmfK4m1t2nDKFX_MZr8",
"creationTimeStamp" : 1.497523097283577E9,
"id" : "-KmfKFxY2BsLjpGixowG",
"senderID" : "xpyM19QVjJTgrtdntlbcJPkb0jB2",
"sendingStatusIndex" : 0,
"textMessage" : "3reds",
"typeIndex" : 0
},
会话模型
"-KmfK4m1t2nDKFX_MZr8" : {
"id" : "-KmfK4m1t2nDKFX_MZr8",
"lastMessage" : {
"conversationID" : "-KmfK4m1t2nDKFX_MZr8",
"creationTimeStamp" : 1.497591480636771E9,
"id" : "-KmjP72nyEJUX7yQmwYp",
"senderID" : "AoG6HmxXE8ahAESx98C2UZ0ieAh1",
"sendingStatusIndex" : 0,
"textMessage" : "C",
"typeIndex" : 0
},
"typeIndex" : 0,
"userAcitivities" : [ {
"removedChatTimeStamp" : 0,
"userID" : "xpyM19QVjJTgrtdntlbcJPkb0jB2"
}, {
"removedChatTimeStamp" : 0,
"userID" : "AoG6HmxXE8ahAESx98C2UZ0ieAh1"
} ]
}
用户对话模型
"AoG6HmxXE8ahAESx98C2UZ0ieAh1" : {
"-KmeqR8RYXo-5Pt0gue1" : {
"friendID" : "QscqImQoCGdAciaVMoRJN35KjEH2",
"id" : "-KmeqR8RYXo-5Pt0gue1",
"removedChatTimeStamp" : 0,
"typeIndex" : 0
},
更新说明
您好!我正在聊天! Firebase用作后端。问题是如何在群聊中最好地上传用户图像。消息模型当然在应用程序中有一个senderID。在每个单元格中出现的最糟糕的选项(我将不会使用它)是查询最新的URL并使用Kingfisher加载和缓存图像。启动应用程序/聊天时的第二个选项是更新或上传聊天室中可用的所有用户的头像,但这里存在两个问题。第一个问题,如果聊天将是50,并且在50个用户的每次聊天中,那么一次做2500个查询也不是一个选项。第二个问题,如果以某种方式避免,很多请求,那么从这些数据中可以创建一个字典并将其传输到一个单元格,并由senderID获取Kingfisher的实际网址,但我认为它&#39太可怕了,Plus可以说性能。这个或那个基于firebase的聊天最简单的例子。
还有几种选择,但它们都很糟糕。你能告诉我这样做最好吗?或者在哪里查找和阅读这个"模块的正确架构"。
答案 0 :(得分:0)
我解决了这个问题如下,当打开ChatViewController时,我使用云函数请求所有用户图像的链接,我在应用程序中获得了准备字典[userID:userAvatarPath]。
{'A': [<generator object <genexpr> at 0x7f998d0640f0>], 'C': [<generator object <genexpr> at 0x7f998d064140>], 'B': [<generator object <genexpr> at 0x7f998d0640a0>], 'D': [<generator object <genexpr> at 0x7f998d064050>]}