公告频道介绍
更新时间: 2024/09/27 10:50:00
圈组的社区广场,是社区的集合展示,支持无上限人数、话题分组、以及自定义的权限管理。
技术原理
目前广场实现逻辑是通过约定协议向外部请求社区广场所需要的数据,然后根据自身的业务场景回填广场数据,内部会根据填入的数据进行展示。
同时,内部的点击操作也会同步给外部监听,可以根据自身的业务逻辑自定义跳转,目前圈组 Demo 的展现形式是跳转到社区列表,社区列表以游客的形式展示(未加入的情况),如果已加入就跳转到社区列表,并定位到对应的社区数据。
效果展示
前提条件
已集成圈组界面。
实现方式
主要协议数据对象
以下为广场需要外部传入的数据:
QChatSquareServer
社区广场
参数名 | 参数类型 | 参数说明 |
---|---|---|
isJoinedServer | Bool | 当前用户是否已加入此社区,外部不需要关心,内部会查询以及动态监听来更新此字段 |
server | QChatServer |
社区数据对象 |
QChatSquarePageInfo
广场类型数据
参数名 | 参数类型 | 参数说明 |
---|---|---|
type | int | 广场数据的类型,后续请求具体 TAB 下对应的数据,会传给外部 |
title | string | TAB 显示的标题文案 |
QChatServer
社区
参数名 | 参数类型 | 参数说明 |
---|---|---|
serverId | UInt64 | 社区 ID |
appId | NSInteger | 应用 ID |
name | String | 社区名称 |
icon | String | 社区图标 |
custom | String | 自定义扩展信息 |
owner | String | 社区所有者 |
memberNumber | NSInteger | 社区成员数量 |
inviteMode | QChatServerInviteMode | 加入社区的邀请模式 |
applyMode | QChatServerApplyMode | 加入社区的申请模式 |
validFlag | Bool | 社区的有效标志:false-无效,true-有效 |
createTime | TimeInterval | 社区创建时间 |
updateTime | TimeInterval | 社区更新时间 |
广场模块相关协议
swiftpublic protocol SquareDataSourceDelegate: NSObjectProtocol {
// 获取广场顶部 Tab 数据的回调协议
func requestSquareSearchType(_ completion: @escaping ([QChatSquarePageInfo], NSError?) -> Void)
// 获取广场 TAB 下对应的广场列表数据
func requestServerInfoForSearchType(_ searchType: Int, _ completion: @escaping ([QChatSquareServer], NSError?) -> Void)
// 点击广场中的具体社区的回调
func didSelectSquareServer(server: QChatSquareServer)
}
广场模块初始化
swiftlet square = QChatSquareHomeViewController()
square.delegate = self
广场模块实现示意代码
该代码仅用于参考其实现广场模块的思路和逻辑,不能直接复制运行,请根据您自身的业务逻辑具体实现。
代码中主要是广场数据回填逻辑。
swiftfunc requestSquareSearchType(_ completion: @escaping ([QChatSquarePageInfo], NSError?) -> Void) {
// DemoService 示例业务服务器的请求类,使用时候只参考 call back 回调的逻辑
DemoService.getSearchTypeData { error, result in
var infos = [QChatSquarePageInfo]()
if let datas = result?.originData?["data"] as? [Any] {
datas.forEach { item in
let info = QChatSquarePageInfo()
if let dic = item as? [String: Any] {
if let type = dic["type"] as? Int {
info.type = type
}
if let title = dic["title"] as? String {
info.title = title
}
}
infos.append(info)
}
completion(infos, error as NSError?)
} else {
completion(infos, error as NSError?)
}
}
}
func requestServerInfoForSearchType(_ searchType: Int, _ completion: @escaping ([QChatSquareServer], NSError?) -> Void) {
// DemoService 示例业务服务器的请求类,使用时候只参考 call back 回调的逻辑
DemoService.getSquareData(searchType: searchType) { error, result in
var servers = [QChatSquareServer]()
if let datas = result?.originData?["data"] as? [Any] {
datas.forEach { item in
let imServer = NIMQChatServer()
if let dic = item as? [String: Any] {
if let sid = dic["serverId"] as? String, let id = UInt64(sid) {
imServer.serverId = id
}
if let name = dic["serverName"] as? String {
imServer.name = name
}
if let icon = dic["icon"] as? String {
imServer.icon = icon
}
if let custom = dic["custom"] as? String {
imServer.custom = custom
}
}
let server = QChatServer(server: imServer)
let squareServer = QChatSquareServer()
squareServer.server = server
servers.append(squareServer)
}
completion(servers, error as NSError?)
} else {
completion(servers, error as NSError?)
}
}
}
func didSelectSquareServer(server: QChatSquareServer) {
// 切换圈组社区列表所在 tab
selectedIndex = 1
qchatHomeController?.setSquareServer(squareServer: server)
}
此文档是否对你有帮助?