5_5-手机开播场景-聊天室
1 功能概述
聊天室模組包含發言、歷史記錄檢視、訊息回覆、踢人、禁言等功能。聊天室模組在 UI、互動、功能上,相較於其他模組,會更複雜且更龐大。因此設計、建置、維護一個聊天室,也是一件較為耗時費力的事情。我們推薦直接使用保利威封裝好的聊天室模組,該部分程式碼完全開源,支援直接使用以及二次開發。
2 核心類別介紹
2.1 PLVLSChatroomViewModel
PLVLSChatroomViewModel 是手機開播場景 Scene 層聊天室的核心類別,由於一個應用程式只允許存在一個聊天室,所以 PLVLSChatroomViewModel 採用的是單例模式,負責建立、持有、銷毀 Common 層聊天室核心類別 PLVChatroomPresenter 的實例物件,以及與 Common 層聊天室模組進行通訊。核心類別 PLVLSChatroomViewModel 提供的功能如下:
對 View 層提供發送訊息的介面;
管理 Common 層回傳的訊息模型;
在 View 層需要重新整理 UI、更新列表資料時,透過回呼通知 View 層。
2.1.1 生命週期
PLVLSChatroomViewModel 是單例類別,進入直播間啟動聊天室時呼叫 -setup 方法,離開直播間時呼叫 -clear 方法,程式碼如下:
// 使用新的直播间数据启动聊天室管理器
[[PLVLSChatroomViewModel sharedViewModel] setup];
// 退出前调用,用于资源释放、状态位清零
[[PLVLSChatroomViewModel sharedViewModel] clear];
程式碼註解提到的「直播間資料」指的是 PLVRoomDataManager 單例持有的 roomData。
2.1.2 取得聊天記錄
Common 層聊天室核心類別 PLVChatroomPresenter 在初始化完畢之後,會自動取得第一頁的聊天記錄,預設一頁的訊息條數為 20,取得更多聊天記錄的程式碼如下:
[[PLVLSChatroomViewModel sharedViewModel] loadHistory];
2.1.3 發送訊息與訊息回覆
PLVLSChatroomViewModel 類別提供手機開播場景所需的發送訊息的 API,具體介面定義如下:
/// 发送文本消息
/// @param content 消息文本
/// @param replyChatModel 回复消息模型(非回复消息该字段为nil)
/// @return YES表示数据将有更新,可等待收到回调后刷新列表;NO表示socket未登录或房间关闭,可进行toast提示
- (BOOL)sendSpeakMessage:(NSString *)content replyChatModel:(PLVChatModel * _Nullable)replyChatModel;
/// 发送图片消息
/// @param image 图片
/// @return YES表示数据将有更新,可等待收到回调后刷新列表;NO表示socket未登录或房间关闭,可进行toast提示
- (BOOL)sendImageMessage:(UIImage *)image;
2.1.4 訊息陣列
PLVLSChatroomViewModel 類別提供以下訊息列表陣列,作為聊天室 View 層的資料來源:
/// 全部消息数组
@property (nonatomic, strong, readonly) NSMutableArray <PLVChatModel *> *chatArray;
2.1.5 監聽與回呼
PLVLSChatroomViewModel 提供了屬性 delegate 用於設定回呼監聽,屬性 delegate 遵循協定 PLVLSChatroomViewModelProtocol,用於在 View 層需要重新整理 UI、更新列表資料時,透過回呼通知 View 層:
@protocol PLVLSChatroomViewModelProtocol <NSObject>
@optional
/// 返回本地发送的公聊消息(包含禁言的情况)
/// 用于刷新列表、滚动列表到底部
- (void)chatroomViewModel_didSendMessage;
/// 返回socket接收到的公聊消息
/// 用于刷新列表、显示新消息提示
- (void)chatroomViewModel_didReceiveMessages;
/// socket通知有消息被删除(1条或多条)
/// 用于刷新列表
- (void)chatroomViewModel_didMessageDeleted;
/// 获取历史聊天记录成功时触发
/// 用于刷新列表,停止【下拉加载更多】控件的动画
/// @param noMore 是否还有更多历史消息,YES表示已加载完,此时可隐藏【下拉加载更多】控件
/// @param first 是否是初次加载历史消息,初次加载需滚动列表到底部
- (void)chatroomViewModel_loadHistorySuccess:(BOOL)noMore firstTime:(BOOL)first;
/// 获取历史聊天消息失败时触发
/// 用于停止【下拉加载更多】控件的动画
- (void)chatroomViewModel_loadHistoryFailure;
@end
