公告频道介绍

更新时间: 2024/03/15 18:26:23

圈组的社区广场,是社区的集合展示,支持无上限人数、话题分组、以及自定义的权限管理。

技术原理

目前广场实现逻辑是通过约定协议向外部请求社区广场所需要的数据,然后根据自身的业务场景回填广场数据,内部会根据填入的数据进行展示。

同时,内部的点击操作也会同步给外部监听,可以根据自身的业务逻辑自定义跳转,目前圈组 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)
  }
此文档是否对你有帮助?
有帮助
去反馈
  • 技术原理
  • 效果展示
  • 前提条件
  • 实现方式
  • 主要协议数据对象
  • 广场模块相关协议
  • 广场模块初始化
  • 广场模块实现示意代码