保利威文档中心

幫助中心

3_3-云课堂场景-聊天室

更新時間:2023-04-17 15:27:57

1 功能概述

聊天室模組包含發言、按讚、歷史記錄、歡迎詞等功能。聊天室模組在 UI、互動、功能上,相較於其他模組,會更複雜且更龐大。因此設計、搭建、維護一個聊天室,也是一件較為耗時費力的事情。我們推薦直接使用保利威封裝好的聊天室模組,該部分程式碼完全開源,支援直接使用以及二次開發。

2 核心類別介紹

2.1 PLVLCChatroomViewModel

PLVLCChatroomViewModel 是雲課堂場景 Scene 層聊天室的核心類別,由於一個應用只允許存在一個聊天室,所以 PLVLCChatroomViewModel 採用的是單例模式,負責建立、持有、銷毀 Common 層聊天室核心類別 PLVChatroomPresenter 的實例物件以及與 Common 層聊天室模組進行通訊,核心類別 PLVLCChatroomViewModel 提供功能如下:

  1. 對 View 層提供發送訊息的介面;

  2. 管理 Common 層回傳的訊息模型;

  3. 在 View 層需要重新整理 UI、更新列表資料時,透過回呼通知 View 層。

2.1.1 生命週期

PLVLCChatroomViewModel 是單例類別,進入直播間啟動聊天室的時候呼叫 -setup 方法,離開直播間時呼叫 -clear 方法,程式碼如下:

// 使用新的直播间数据启动聊天室管理器
[[PLVLCChatroomViewModel sharedViewModel] setup];
// 退出前调用,用于资源释放、状态位清零
[[PLVLCChatroomViewModel sharedViewModel] clear];

程式碼註解提到的「直播間資料」指的是 PLVRoomDataManager 單例持有的 roomData

2.1.2 取得聊天記錄

Common 層聊天室核心類別 PLVChatroomPresenter 在初始化完畢之後,會自動取得第一頁的聊天記錄,取得更多聊天記錄程式碼如下:

[[PLVLCChatroomViewModel sharedViewModel] loadHistory];

-loadHistory 使用在 2.1.1 的 -setup 方法裡初始化的 presenter 物件,呼叫 Common 層聊天室模組取得聊天室記錄。

2.1.3 發送訊息

PLVLCChatroomViewModel 類別提供帶貨場景所需的發送訊息的 API,具體介面定義如下:

/// 发送私聊提问消息
/// @param content 消息文本
/// @return YES表示数据将有更新,可等待收到回调后刷新列表;NO表示socket未登录或房间关闭,可进行toast提示
- (BOOL)sendQuesstionMessage:(NSString *)content;

/// 发送文本消息
/// @param content 消息文本
/// @return YES表示数据将有更新,可等待收到回调后刷新列表;NO表示socket未登录或房间关闭,可进行toast提示
- (BOOL)sendSpeakMessage:(NSString *)content;

/// 发送图片消息
/// @param image 图片
/// @return YES表示数据将有更新,可等待收到回调后刷新列表;NO表示socket未登录或房间关闭,可进行toast提示
- (BOOL)sendImageMessage:(UIImage *)image;

/// 发送点赞消息
/// 点赞数的实时更新通过监听roomData的likeCount获得
- (void)sendLike;
2.1.4 訊息陣列

PLVLCChatroomViewModel 類別提供以下訊息列表陣列,作為聊天室 View 層的資料來源:

/// 公聊消息数组
@property (nonatomic, strong, readonly) NSMutableArray <PLVChatModel *> *chatArray;
/// 私聊消息数组
@property (nonatomic, strong, readonly) NSMutableArray <PLVChatModel *> *privateChatArray;
2.1.5 監聽與回呼

PLVLCChatroomViewModel 允許設定多代理監聽,提供了以下介面增加監聽和移除監聽:

/// 增加PLVLCChatroomViewModelProtocol协议的监听者
/// @param delegate 待增加的监听者
/// @param delegateQueue 执行回调的队列
- (void)addDelegate:(id<PLVLCChatroomViewModelProtocol>)delegate delegateQueue:(dispatch_queue_t)delegateQueue;

/// 移除PLVLCChatroomViewModelProtocol协议的监听者
/// @param delegate 待移除的监听者
- (void)removeDelegate:(id<PLVLCChatroomViewModelProtocol>)delegate;

上面兩個介面提到的協定 PLVLCChatroomViewModelProtocol 提供了以下這些代理方法,這些方法均是用於在 View 層需要重新整理 UI、更新列表資料時,透過回呼通知 View 層:

@protocol PLVLCChatroomViewModelProtocol <NSObject>

@optional

#pragma mark 私聊

/// 本地发送了新的私聊消息
/// 用于刷新列表
- (void)chatroomManager_didSendQuestionMessage;

/// 通知socket接收到新的私聊(教师回答)消息,每次1条
/// 用于刷新列表、显示新消息提示
- (void)chatroomManager_didReceiveAnswerMessage;

#pragma mark 公聊

/// 返回本地发送的公聊消息(包含禁言的情况)
/// 用于刷新列表、发送弹幕
/// @param model 消息模型,不为空
- (void)chatroomManager_didSendMessage:(PLVChatModel *)model;

/// 返回socket接收到的公聊消息
/// 用于刷新列表、发送弹幕、显示新消息提示
/// @param modelArray 消息队列,不为空
- (void)chatroomManager_didReceiveMessages:(NSArray <PLVChatModel *> *)modelArray;

/// socket通知有消息被删除(1条或多条)
/// 用于刷新列表
- (void)chatroomManager_didMessageDeleted;

/// 获取历史聊天记录成功时触发
/// 用于刷新列表,停止【下拉加载更多】控件的动画
/// @param noMore 是否还有更多历史消息,YES表示已加载完,此时可隐藏【下拉加载更多】控件
/// @param first  是否是初次加载历史消息,初次加载需滚动列表到底部
- (void)chatroomManager_loadHistorySuccess:(BOOL)noMore firstTime:(BOOL)first; 

/// 获取历史聊天消息失败时触发
/// 用于停止【下拉加载更多】控件的动画
- (void)chatroomManager_loadHistoryFailure;

/// 如果4秒内有登录聊天室的用户(包括自己),间隔4秒触发一次
/// @param userArray 4秒内登录聊天室的用户数组,如果为nil,表示当前时间段内当前用户有登录事件
- (void)chatroomManager_loginUsers:(NSArray <PLVChatUser *> * _Nullable )userArray;

/// 上报管理员发布的消息文本,间隔8秒触发一次
/// @param content 管理员消息文本
- (void)chatroomManager_managerMessage:(NSString * )content;

/// 上报需插入弹幕的文本,间隔1秒触发一次
/// @param content 弹幕文本
- (void)chatroomManager_danmu:(NSString * )content;

@end
联系客服,在线咨询