我的群列表,實(shí)現(xiàn)思路

群聊的時(shí)候,是所有人都收到群發(fā)消息,只是程序需要判斷下,我在不在這個(gè)群里,如果我在群里我繼續(xù)收到消息,如果我不在群里我其實(shí)還是收到了消息,只是程序判斷我不應(yīng)該看到這個(gè)消息return了。

所以,所有的群聊聊天室,其實(shí)所有人都在,只是程序根據(jù)當(dāng)前用戶是否在這個(gè)群里做了過濾顯示。---這個(gè)很重要。(可能還有更好的方案,目前我感覺這種最簡單,可快速實(shí)現(xiàn)所有功能),這樣操作可能會(huì)導(dǎo)致數(shù)據(jù)浪費(fèi),不過首先這個(gè)不需要流量,其次這個(gè)app的用戶群里兩位數(shù),基本確定沒什么高并發(fā)的數(shù)據(jù)問題。假設(shè)有先實(shí)現(xiàn)功能后面再優(yōu)化。

假設(shè),現(xiàn)在有三個(gè)人:張三(103),李四(104),王五(105)。 目前他們都是新用戶,沒有一個(gè)群。


1. 如何知道有哪些群?

張三,李四,王五全部在線。

張三拉李四,王五創(chuàng)建群a,創(chuàng)建后張三是群主,創(chuàng)建群成功的時(shí)候,張三需要本地寫一個(gè)緩存(或者數(shù)據(jù)庫), 我覺得數(shù)據(jù)庫比較好,因?yàn)橹徊迦胍粭l數(shù)據(jù)就可以了。緩存你還要鼓搗數(shù)組,先取再改再存,比較麻煩。強(qiáng)烈建議用sqlite, 我這里按sqlite思路走。

id ? ? creater(群主) ? ? ? name(群名稱) ? ?head_image(群頭像) ? ? members(群成員) ? ? ?updated(群信息更新時(shí)間)

1 ? ? ? ? ? ?103 ? ? ? ? ? ? ? ? ? ? ? ?群a ? ? ? ? ? ? ? ? ? ? ?group1.png ? ? ? ? ? ? ? ? ? ? ? ?103,104,105 ? ? ? ? ? ? ? ? ? ?1965646479

注: 上面是數(shù)據(jù)庫字段與對(duì)應(yīng)的第一條數(shù)據(jù)記錄,其中members最好是新開一張表外鍵關(guān)聯(lián),如果你不太了解外鍵關(guān)聯(lián)查詢,可以把所有的成員用一個(gè)大的字符串表示,中間用逗號(hào)隔開。

此時(shí)沒有任何人說話,那么此時(shí)只有張三一個(gè)人知道有這個(gè)群的存在。可能你會(huì)想在創(chuàng)建群的時(shí)候發(fā)一個(gè)群發(fā)消息告知其他人,這樣做沒問題只是意義不大,因?yàn)檫@個(gè)群里面假設(shè)李四不在線,他一樣不知道群的存在,這個(gè)操作沒有太大的意義,而且下面的優(yōu)化操作將取代這個(gè)思路。

然后,張三說話: 大家好。消息體數(shù)據(jù)格式如下:

{

?????type: "text", ? ?// 文字消息

? ? ?from: "103", ? ?//張三的ip

? ? message_type: "group", ? ? //群消息, 假設(shè)為單聊,這里為single

????group:{

? ? ? ? id: 1, ? // 群id

? ??????creater:103, ?//群主,只有群主可以修改群信息,修改群信息后updated會(huì)變成當(dāng)前時(shí)間戳

? ? ? ? name: ??群a, ?//群名字,特別注意,這個(gè)名字可能會(huì)變,怎么優(yōu)化下面提到, 和updated有關(guān)

? ??????head_image:??group1.png, ?//群頭像,特別注意,這個(gè)名字可能會(huì)變,怎么優(yōu)化下面提到, 和updated有關(guān)

? ??????members:?103,104,105, ? ?//群成員,這個(gè)字段非常重要, 是控制群成員的法寶

? ??????updated:1965646479 ? ? ?//群信息更新時(shí)間

????}

}

上面是發(fā)一條群消息的數(shù)據(jù)體,里面包含了很多重要信息。

此時(shí),李四和王五收到消息(didReceiveGroupMessage),以李四為例,收到消息后,

message_type == "group", ?說明是群消息,首先檢查下,自己有沒有id=1這個(gè)群,發(fā)現(xiàn)沒有,于是根據(jù)group對(duì)象在本地?cái)?shù)據(jù)庫新建寫了一條數(shù)據(jù)如下:

id ? ? creater(群主) ? ? ? name(群名稱) ? ?head_image(群頭像) ? ? members(群成員) ? ? ?updated(群信息更新時(shí)間)

1 ? ? ? ? ? ?103 ? ? ? ? ? ? ? ? ? ? ? ?群a ? ? ? ? ? ? ? ? ? ? ?group1.png ? ? ? ? ? ? ? ? ? ? ? ?103,104,105 ? ? ? ? ? ? ? ? ? ?1965646479

王五同理。


現(xiàn)在假設(shè),王五不在線,那么他離線狀態(tài)立馬上線肯定是不知道這個(gè)群存在的。只有在線,且其他群成員發(fā)一條消息過來,他重復(fù)上面的代碼即可。同一套邏輯只是時(shí)間晚了點(diǎn)而已。

據(jù)我觀察,微信拉群組機(jī)制和上面這個(gè)一模一樣。


2. 群信息變更如何處理?

假設(shè)張三修改了群名稱和群頭像,那么id=1的群的updated等于修改時(shí)候的時(shí)間戳,張三再發(fā)消息的時(shí)候,李四和王五在didReceiveGroupMessage收到消息的時(shí)候

1. 檢查自己是否有id=1的群, ?(發(fā)現(xiàn)有,不需要插入新群)

2. 核對(duì)updated是否相等,發(fā)現(xiàn)不相等(說明群主更新了群信息,更新本地這條群數(shù)據(jù))

這樣就簡單實(shí)現(xiàn)了群信息的更新與同步。


3. 如果在群列表確定我是否有某個(gè)群,或者說我有哪些群?

這個(gè)很簡單,直接讀取數(shù)據(jù)庫即可。一切以數(shù)據(jù)庫為準(zhǔn)。


4. 如果李四被群主張三從群里移除了怎么處理?

這個(gè)操作還是在didReceiveGroupMessage里面操作,其實(shí)上面已經(jīng)做了,就是群信息變更里面。

核對(duì)updated是否相等,發(fā)現(xiàn)不相等(說明群主更新了群信息,更新本地這條群數(shù)據(jù)),

比如張三沒改頭像,沒改群名稱,就刪了李四。這同樣是更改了群信息。updated同樣發(fā)生了變化。李四在收到消息后,

1. 檢查自己是否有id=1的群, ? (發(fā)現(xiàn)有,不需要插入新群)

2. 核對(duì)updated是否相等,發(fā)現(xiàn)不相等(說明群主更新了群信息,更新本地這條群數(shù)據(jù))

注意:寫到這里,更準(zhǔn)確的說,應(yīng)該是先判斷下自己還在不在members里面,如果在才更新,如果我自己不存在這個(gè)members里面了,說明群主把我移除了,不需要更新,直接delete這條數(shù)據(jù)庫如果我現(xiàn)在正在這個(gè)聊天室,還應(yīng)該退出當(dāng)前聊天室,直接pop就可以了,因?yàn)閜op到外面,數(shù)據(jù)庫更新了,頁面onShow一刷新顯示最新的數(shù)據(jù)庫,剛剛的群肯定不見了,因?yàn)楸镜財(cái)?shù)據(jù)庫都在剛剛delete了。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容