WX_Chat_YJ
做了一段時間的IM,這次把之前遇見的一些坑記錄一下,後面有時間把聊天部分,做一些分享,希望對大家有點幫助。之前在網上一直看的專案中,在開發中途遇見坑說得比較少。如果首次寫聊天的話可能遇見的問題會比較多,這裡我主要說說自己遇見坑。歡迎大家拍磚哦。要不同的意見麻煩提出來,謝謝了。大家共同進步!
#一、 基本功能有
-
訊息的撤回、刪除、複製
-
語音、文字、圖片
-
未讀人數
-
專案中自定義的其他訊息樣式
-
實際專案中有云盤、視訊播放、朋友圈...
二、 資料庫使用的是微信開源的WCDB不用寫一句SQL語句。
三、遇見了下列一些坑
1、介面的卡頓
- 介面佈局的時候最開始使用了UITableView+...Cell的第三方自動計算高度,因專案聊天樣式較多,在使用xib佈局的時候只佈局了左右兩個樣式,通過隱藏和顯示來控制樣式。因開發的時候,沒用過多的資料測試,導致資料較多時十分卡頓,老闆說的是卡卡卡,比老牛拉破車還卡.這種卡頓是在滑動頁面的時候就明顯感覺到了。
找到問題的原因之後,以下解決方案:
-
先是手動計算高度同時把Xib佈局的衝突解決掉之後。滑動頁面流暢度可以接受了。當然想達到比較好的流暢度frame佈局可能會更好些。
-
同時這裡Xib在採用Xib佈局的時候,層級儘量少。層級較多會影響流暢性哦。
2、資料的卡頓
- 最開始的時候,因為我們涉及到每條訊息的未讀人數的處理,通過伺服器回執的未讀數去替換當前聊天訊息模型。當聊天人數達到一定層度的時候,看訊息的人就較多了。這時回執比較頻繁,當時回執回來重新整理某一條資料,這時介面又卡其來了。在這個過程中,未讀數的處理。客戶端處理得有一些問題。在滑動頁面的時候把當前未讀訊息發給伺服器,伺服器成功返回了表示已讀。伺服器訊息是要排隊的,頻繁回執給伺服器。伺服器頻繁推給客戶端。導致重新整理頁面太頻繁了。在我們客戶端端就卡起來了。(此時我們替換訊息的問題是,在當前所有訊息遍歷找要替換的資料)
找到問題的根源後,採用了以下方法進行解決:
- 把自己傳送的訊息單獨儲存起來,未讀數的替換隻需要替換當前自己傳送的。
- 並且在確定高度的時候(heightForRowAtIndexPath)在每一個模型中放一個當前訊息的位置。在替換訊息的時候,能夠根據需要快讀找到要替換的訊息。千萬不要寫在這裡 cellForRowAtIndexPath確定位置。要不然就又坑了。
通過上面的方法流暢度基本上達到要求了。只從自己發的訊息找要替換的資料,而且位置已經確定。直接替換即可。
3、資料庫讀訊息的卡頓
- 最開始的時候我們使用的是FMDB,
- 在存資料的時候直接存的模型data,發現當資料比較多的時候,又是卡頓。(我們沒用好) 存的時候感覺比較快,讀的時候資料多的時候卡爆了。這裡還有一個,就是把圖片也轉Data存進去了。當首次進入頁面的時候,如果裡面連續幾十張圖片,這是從外面點進去都要等一會兒。卡死主執行緒了。
發現問題我們就解決問題:
- 資料庫我們使用了微信開源的WCDB,各方面都要爽一些。不用謝SQL語句了。
存模型,取的也是模型,毫無卡頓。
- 圖片的處理我們使用把圖片轉data存沙盒中,根據圖片地址和訊息的中的關鍵欄位做為key存沙盒中。這時資料庫只需要存地址即可。根據這個地址作為的key,找出圖片。經測試圖片幾十張也沒有感覺。這裡我們只快取了自己發的圖片。對方的圖片SdwebImageView做了快取。快取自己的圖片目的是傳送使用做處理。這裡使用了NScache快取處理正在碼程式碼中...
4、當頁面全是表情的時候卡頓
- 經過上面的處理普通情況下,流暢度已經能接受了。
但是在某天有一個同事發了整頁,都是系統鍵盤自帶的表情,我去又卡起來了。而且其他同事也發,又是卡卡卡,這種心情大家都能理解(另外加一句我們公司有個測試情況,就是大家在一個規定的時間週一到週五每天中午半小時測試、週末晚上測試半小時。老闆及所有的員工都在)。因為我們用的是普通的UILable沒做任何處理。
這是我想起了YYLable,非同步渲染,讓介面要多流暢有多流暢.更換之後流暢度增加不少。
5、嚴重漏訊息
- 第一版聊天出來之後,多人一起測試。發現漏訊息十分嚴重。 經排查我們在存訊息的時候,出現了重要問題。
- 當前解決方案:
- 根據socket推過來的訊息,只要socket連起在就存。
- 並且當接受到訊息之後,返回給伺服器(間隔很短時間返給伺服器接受到了當前最大的一條訊息)。如果不回執的話伺服器就會在發訊息的時候推送多條,這裡要自己排重。
- 而且網路斷開 socket重連的時候也會拉取訊息,有效保證了資料
6、聊聊多人頭像的卡頓
在這裡我們要做像釘釘和微信一樣的9人頭像。而且沒有頭像的時候,頭像的位置要顯示姓名的最後一個字。
這裡我使用了9個按鈕,按鈕有圖片和文字能。以為寫出來在資料較多的時候會卡,結果就通過把9個頭像按鈕,根據實際頭像個數來計算frame調整位置,隱藏不需要按鈕。結果寫出來之後。效果還不錯。流暢度能達到要求。隨便說一句這個頭像有三個人寫過。嘿嘿。