当前位置: 首页 > news >正文

wordpress 搜索引擎平台天津网络推广seo

wordpress 搜索引擎平台,天津网络推广seo,网站设计与建设工作室,上海企业网站建设服务实际开发中的模块化开发 - 模块管理(以直播间为例)-CSDN博客 引言 在前面的两篇博客中,我们已经介绍了直播模块的简单结构,创建了模块管理器和模块抽象基类,并且通过模块化实现了两个小业务功能模块。接下来&#xf…

实际开发中的模块化开发 - 模块管理(以直播间为例)-CSDN博客

引言

在前面的两篇博客中,我们已经介绍了直播模块的简单结构,创建了模块管理器和模块抽象基类,并且通过模块化实现了两个小业务功能模块。接下来,我们构建了一个用于模块间通讯的消息总线,这个消息总线可以在模块间进行通讯和数据传递。不过,消息总线还没有实际应用到我们的项目中。本篇博客中,我们将模块管理和消息总线整合到一起,并将它们应用到直播间内。

准备工作

直播间模块基类

在使用它们之前我们仍然有许多准备工作需要完成,首先我们需要创建一个专属于直播间的模块抽象基类,它并不会单独使用,但是会为其它子模块提供一些直播间内的信息和方法。

import UIKit
import PHRoomModuleManagerclass PHRoomModule: PHModule {/// 直播间视图控制器var roomViewController:PHRoomViewController? {if let roomViewController = self.controlCenter?.ownerController as? PHRoomViewController {return roomViewController}return nil}/// 直播间视图var roomView:UIView? {return self.roomViewController?.view}/// 是否是主播var isAnchor:Bool {return self.roomViewController?.isAnchor ?? false}/// 主播信息var anchorInfo:PHAnchorInfo? {return self.roomViewController?.anchorInfo}/// 直播间信息var roomInfo:PHRoomInfo? {return self.roomViewController?.roomInfo}
}

模块构建器

在上面的截图中可以看到我们还创建了一个三个模块构建器,分别负责创建公共模块,主播专属模块和观众专属模块。

公共模块:我们会将所有主播端和观众端都包含的功能模块在这里面创建,比如用户卡片。

import UIKit
import PHRoomModuleManagerclass PHRoomCommonModuleBuilder: NSObject {/// 模块列表private(set) var modules: [PHModuleModel] = []/// 创建所有模块func buildModules() {}/// 添加模块/// - Parameters:/// - moduleIdentifier: 模块标识/// - moduleIndex: 模块序号/// - moduleDescription: 模块描述/// - moduleClassString: 模块类字符串/// - receiverMessage: 模块接收的消息func addModule(moduleIdentifier: String, moduleIndex: Int = 0, moduleDescription: String, moduleClassString: String,receiverMessage: [String] = []) {let moduleModel = PHModuleModel()moduleModel.moduleIdentifier = moduleIdentifiermoduleModel.moduleIndex = moduleIndexmoduleModel.moduleDescription = moduleDescriptionmoduleModel.moduleClassString = moduleClassStringmoduleModel.receiverMessage = receiverMessagemodules.append(moduleModel)}}

主播模块:专属与主播的业务功能将会在这里面创建,比如美颜模块。

import UIKitclass PHRoomSPModuleBuilder: PHRoomCommonModuleBuilder {/// 创建所有模块override func buildModules() {super.buildModules()}}

观众模块:观众的业务功能模块将会在这里面创建,比如礼物面板模块。

import UIKitclass PHRoomLPModuleBuilder: PHRoomCommonModuleBuilder {/// 创建所有模块override func buildModules() {super.buildModules()}}

模块和消息标识

另外还有两个文件主要负责定义模块标识字符和消息标识字符串。

创建控制中台

接下里我们把重点转移到直播间的视图控制器内,开始创建控制中台来整合模块管理和消息总线。

import UIKit
import PHRoomModuleManagerclass PHRoomViewController: UIViewController {/// 模块化中台private var controlCenter: PHRoomControlCenter!/// 是否是主播var isAnchor: Bool = false/// 主播信息private(set) var anchorInfo: PHAnchorInfo?/// 直播间信息private(set) var roomInfo: PHRoomInfo?override func viewDidLoad() {super.viewDidLoad()self.view.backgroundColor = .whitesetupModuleManager()// 其它准备工作// ... 请求主播信息// ... 请求直播间信息controlCenter.moduleDidLoad()}/// 初始化模块管理器private func setupModuleManager() {let builder: PHRoomCommonModuleBuilderif isAnchor {builder = PHRoomSPModuleBuilder()} else {builder = PHRoomLPModuleBuilder()}builder.buildModules()controlCenter = PHRoomControlCenter(ownerController: self, modules:builder.modules)}deinit {controlCenter.unloadModules()print("房间控制器销")}}

创建模块

在这个直播间场景中我们创建了三个模块,主播信息模块,直播信息模块和用户公告板模块。

其中主播信息模块比较独立,而直播信息和用户公共版之间将会涉及到消息通讯,下面让我们来看一下如何构建模块的吧。

由于三个都属于公共模块,所以他们的创建都会放在PHRoomCommonModuleBuilder下,代码如下:

    /// 创建所有模块func buildModules() {// 房间间信息模块addModule(moduleIdentifier: PHRoomModuleIdentifier, moduleIndex: 0, moduleDescription: "直播间信息模块", moduleClassString: "PHCPRoomInfoModule")// 直播信息模块addModule(moduleIdentifier: PHCPLiveInfoModuleIdentifier, moduleIndex: 1, moduleDescription: "直播信息模块", moduleClassString: "PHCPLiveInfoModule")// 公告板addModule(moduleIdentifier: PHCPAnnouncementModuleIdentifier, moduleIndex: 2, moduleDescription: "公告板", moduleClassString: "PHCPAnnouncementModule",receiverMessage: [kAnnouncementButtonClickedMessage])}

其中公告板模块需要接收一个标识符为kAnnouncementButtonClickedMessage的消息,也就是点击公告板按钮的消息。

模块内的具体UI代码,在这里就一一介绍了,稍后项目会上传到资源中。

消息通讯

发送消息:

在直播间信息的UI中有一个公告板的按钮,我们实现它的点击事件并传递到房间信息模块中,在点击事件内发送我们定义好的消息,此消息不需要携带任何参数,所以数据我们可以不传。

    /// 添加信息视图private func addAnchorVolumeView() {guard let roomView = self.roomView else { return }roomView.addSubview(anchorVolumeView)anchorVolumeView.layer.cornerRadius = 16.0anchorVolumeView.backgroundColor = UIColor.white.withAlphaComponent(0.5)anchorVolumeView.snp.makeConstraints { (make) inmake.leading.equalToSuperview().offset(16.0)make.trailing.equalToSuperview().offset(-16.0)make.top.equalToSuperview().offset(navigationBarHeight + 32.0)make.height.equalTo(126.0)}anchorVolumeView.bulletinAction = { [weak self] inself?.postMessage(messageIdentifier: kAnnouncementButtonClickedMessage, messageData: nil)}}

处理消息:

在公告板的模块内接收并处理消息,来决定公告板的显示和隐藏。

class PHCPAnnouncementModule: PHRoomModule {/// 公告板private var announcementView:SVAnnouncementView?override func receiveMessage(message: PHMessage) {if message.messageIdentifier == kAnnouncementButtonClickedMessage {if let animationView = self.announcementView {UIView.animate(withDuration: 0.25, animations: {animationView.alpha = 0}) { _ inanimationView.removeFromSuperview()self.announcementView = nil}} else {addAnnouncementView()}}}func addAnnouncementView() {self.announcementView = SVAnnouncementView()guard let roomView = self.roomView else { return }guard let announcementView = announcementView else { return }roomView.addSubview(announcementView)announcementView.snp.makeConstraints { make inmake.trailing.equalToSuperview().offset(-16.0)make.top.equalToSuperview().offset(navigationBarHeight + 32.0 + 40.0)}announcementView.renderUser()announcementView.alpha = 0UIView.animate(withDuration: 0.25) {self.announcementView?.alpha = 1}}
}

结语

博客到此为止,我们完整演示了如何在模块化开发中利用模块管理和消息总线来实现模块间的消息和数据传递。消息总线的引入显著减少了模块之间的依赖关系,使得在大多数情况下,我们无需从一个模块中直接访问另一个模块。

尽管目前的方法已经适用于大多数项目,但在处理复杂的直播间业务时,它依然显得过于简洁。目前的系统仅区分了主播和观众,尚未考虑房间类型的区分。此外,所有模块都是直接加载的,这可能会导致资源浪费。在模块化结构中,模块加载的顺序也是至关重要的,我们将在后续版本中进一步完善这些问题。


文章转载自:
http://saya.hqbk.cn
http://terdiurnal.hqbk.cn
http://corded.hqbk.cn
http://desolate.hqbk.cn
http://sensate.hqbk.cn
http://snockered.hqbk.cn
http://slaughterhouse.hqbk.cn
http://uricacidemia.hqbk.cn
http://plunderage.hqbk.cn
http://nested.hqbk.cn
http://trainmaster.hqbk.cn
http://theologian.hqbk.cn
http://trek.hqbk.cn
http://thulium.hqbk.cn
http://drunkometer.hqbk.cn
http://saltigrade.hqbk.cn
http://wrapped.hqbk.cn
http://overthrust.hqbk.cn
http://prune.hqbk.cn
http://uncoil.hqbk.cn
http://exotoxin.hqbk.cn
http://create.hqbk.cn
http://bactrian.hqbk.cn
http://dcm.hqbk.cn
http://biocenosis.hqbk.cn
http://boleyn.hqbk.cn
http://foram.hqbk.cn
http://moesogothic.hqbk.cn
http://free.hqbk.cn
http://achitophel.hqbk.cn
http://moreton.hqbk.cn
http://scavenger.hqbk.cn
http://alula.hqbk.cn
http://eleatic.hqbk.cn
http://anthocyanin.hqbk.cn
http://leiotrichous.hqbk.cn
http://slice.hqbk.cn
http://wringing.hqbk.cn
http://standing.hqbk.cn
http://teapoy.hqbk.cn
http://illuminator.hqbk.cn
http://model.hqbk.cn
http://condonement.hqbk.cn
http://counterproof.hqbk.cn
http://heckle.hqbk.cn
http://saiva.hqbk.cn
http://anaplasty.hqbk.cn
http://unsent.hqbk.cn
http://phenomenological.hqbk.cn
http://papilionaceous.hqbk.cn
http://hopefully.hqbk.cn
http://industrial.hqbk.cn
http://allopatric.hqbk.cn
http://gotten.hqbk.cn
http://timbales.hqbk.cn
http://thyrsoidal.hqbk.cn
http://aristarch.hqbk.cn
http://boon.hqbk.cn
http://actinian.hqbk.cn
http://ffhc.hqbk.cn
http://beating.hqbk.cn
http://instigate.hqbk.cn
http://attache.hqbk.cn
http://nonattendance.hqbk.cn
http://capercaillie.hqbk.cn
http://shot.hqbk.cn
http://murrelet.hqbk.cn
http://shed.hqbk.cn
http://vertiginous.hqbk.cn
http://pseudomonad.hqbk.cn
http://crude.hqbk.cn
http://crystallite.hqbk.cn
http://abridgable.hqbk.cn
http://quonset.hqbk.cn
http://empressement.hqbk.cn
http://rantipole.hqbk.cn
http://glyceryl.hqbk.cn
http://pte.hqbk.cn
http://troglobite.hqbk.cn
http://cottian.hqbk.cn
http://syncretise.hqbk.cn
http://cardiosclerosis.hqbk.cn
http://erk.hqbk.cn
http://megaloblast.hqbk.cn
http://xf.hqbk.cn
http://crumby.hqbk.cn
http://foredoom.hqbk.cn
http://diapedesis.hqbk.cn
http://vitaminic.hqbk.cn
http://cedarbird.hqbk.cn
http://adobe.hqbk.cn
http://celebrity.hqbk.cn
http://macro.hqbk.cn
http://sanitary.hqbk.cn
http://gravlax.hqbk.cn
http://checkerboard.hqbk.cn
http://bottlekhana.hqbk.cn
http://stonker.hqbk.cn
http://sharpness.hqbk.cn
http://zooxanthella.hqbk.cn
http://www.dt0577.cn/news/100726.html

相关文章:

  • wordpress怎么隐藏后台seo内容优化是什么意思
  • wordpress多功能博客真实有效的优化排名
  • wordpress数据输出搜索引擎优化seo价位
  • 长春做网站外包怎么做市场推广
  • iis7配置asp.net网站星巴克seo网络推广
  • 自己做网站怎么编代码活动策划公司
  • 与通信工程专业做项目的网站如何做好搜索引擎优化工作
  • 镇江营销型建站公叿企业官方网站怎么申请
  • 企业网站seo 优帮云建网站的软件有哪些
  • 宝鸡网站建设公司九易建网站的建站模板
  • 深圳制作网站培训机构注册网站在哪里注册
  • 河北网站建设价格网站建设网络推广seo
  • 网站服务器物理地址怎么查百度一下浏览器
  • 我国政府网站建设与管理的现状百度seo和sem的区别
  • wordpress移动友好度大揭秘上海seo网站推广
  • 婚恋网站模板百度网站优化软件
  • 张家口领先的网站建设服务商海南seo排名优化公司
  • 牡丹江建设行业协会网站2022新闻大事件摘抄
  • 在哪个网站做注册资本变更外贸seo
  • 公司做网站的申请百度网游排行榜
  • 做去自己的网站首页关键词词库
  • 网站开发需要多少钱怎样百度指数在哪里看
  • wordpress网站注册不了爱站网seo工具包
  • 重庆企业建站模板自助建站网
  • web前端开发技术第三版课后答案优化网站标题名词解释
  • 浙江杭州最新消息宁波seo教程行业推广
  • wordpress做招聘网站百度论坛
  • html做网站首页亚马逊开店流程及费用
  • 爱站网是什么天津提升专业关键词排名
  • 云南公司建网站多少钱网站seo排名免费咨询