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

儿童衣服刘涛做代言那个是什么网站网络推广专员是干什么的

儿童衣服刘涛做代言那个是什么网站,网络推广专员是干什么的,黄石做网站公司,css 网站背景引言 在现代iOS应用开发中,处理大规模数据是一个常见的挑战。尤其实在直播项目中,礼物面板作为展示用户互动的重要部分,通常需要实时显示海量的礼物数据。这些数据不仅涉及到不同的区域、主播的动态差异,还需要保证高效的加载与渲…

引言

在现代iOS应用开发中,处理大规模数据是一个常见的挑战。尤其实在直播项目中,礼物面板作为展示用户互动的重要部分,通常需要实时显示海量的礼物数据。这些数据不仅涉及到不同的区域、主播的动态差异,还需要保证高效的加载与渲染,以提供流畅的用户体验。

本篇博客将以直播应用中的礼物面板为例,深入探讨如何高效地管理和处理这些庞大的数据。我们将分享一种基于“礼物池”设计的解决方案,从服务端下载并解压存储数据,再根据实时的面板数据提取礼物信息的方式,确保数据的高效存取与更新。同时,还将讨论如何通过合理的本地缓存和更新机制,进一步提升应用性能,并优化用户体验。

如果你也在处理类似的大数据问题,或者正在开发类似的直播应用,本篇博客将为你提供实用的思路和解决方案。

架构介绍

上面所展示的礼物面板中的所有礼物数据,大概有2-4M,这对于一个请求来说应该算是一个非常大的数据量,而由于针对不同地区不同的主播所展示的礼物也不同,那么我们就可以需要频繁的来请求整个礼物面板的数据,每次都请求这么大的数据显然这并不理智。为此我们可以考虑将它分割成两部分:礼物池和礼物面板。

  • 礼物池:礼物池内存放的是所有的礼物该数据由一个接口下发为固定数据几乎不会变动出发有新类型的礼物加入。
  • 礼物面板:根据层级返回每个一级tab对应下的二级tab,而二级tab下只需要包含礼物的id。

礼物池的数据结构如下:

截图中只展示了礼物列表中的一个礼物,而且数据并没有完全展示出来,那这组json来说一共有1600个这样的礼物,整个礼物池大小为3.8M。

礼物面板的数据结构如下:

我们抛开一级tab直接看二级tab下的gifts里面只保存了礼物的id。这也就大大减小了礼物面板的数据大小、获取到礼物的id之后再从礼物池中读取礼物的完整数据。这样即使频繁请求礼物面板接口也不会造成很大性能影响。

礼物池的存储与更新机制

礼物池json文件的压缩包是通过一个接口获取的,该接口会返回礼物池的压缩文件路径,以及礼物池的当前版本号。

等获取到该接口的数据之后,我们需要做的有三件事:

  1. 对比礼物版本号与当前本地礼物版本号,如果相等则不需要更新json文件,直接加载本地json。
  2. 否则将新的礼物池版本号进行保存。
  3. 开始下载新的礼物池压缩包。
    /// 请求礼物池数据private func requestGiftPoolData() {MWNetworkHelper.request(endpoint: MWAPINormalEndpoint.api_giftPoolData, parameters: [:], modelType: MWGiftPoolModel.self) {[weak self] model, data, error inguard let self = self else { return }guard let model = model else {MWLogHelper.error("请求礼物池数据失败 err:\(error?.description ?? "")", context: "MWGiftPoolManager")return}// 是否需要下载新的zipif model.version == MWUserDefaultsAppHelper.giftPoolVersion {self.loadLocalJson(model: model)return}// 将礼物版本号保存到本地MWUserDefaultsAppHelper.giftPoolVersion = model.versionself.startDownloadZip(zip_url: model.default_zip)}}

本地读取

如果本地已经有了礼物池数据,且当前礼物池版本号与本地版本号相同时,那么我们就可以直接读取本地json,但读取本地json时并不一定就会成功,当读取失败,或者转换失败时,需要重新进行下载。

    /// 加载本地json文件/// - Parameter model: 礼物池modelprivate func loadLocalJson(model:MWGiftPoolModel) {// 本地版本号和服务器版本号一致 直接读取if let jsonPath = MWUserDefaultsAppHelper.giftPoolJsonPath {MWLogHelper.info("读取本地json path:\(jsonPath)", context: "MWGiftPoolManager")// 拼接document路径let document = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true).first ?? ""let filePath = document.appending("/\(jsonPath)")do {let jsonData = try Data(contentsOf: URL(fileURLWithPath: filePath))let json = try JSONSerialization.jsonObject(with: jsonData, options: .mutableContainers)if let jsonDict = json as? [String:Any] {MWLogHelper.info("读取本地json成功", context: "MWGiftPoolManager")self.jsonDict = jsonDictself.convertModel(jsonDict: jsonDict)}} catch {MWLogHelper.error("读取本地json失败 重新下载 err:\(error.localizedDescription)", context: "MWGiftPoolManager")// 转换失败也需要重新下载self.startDownloadZip(zip_url: model.default_zip)}}}

下载zip解压并存储

如果json文件需要更新或者首次下载,那么在下载完成之后需要将json写入到本地,供以后直接读取。

    /// 开始下载zipprivate func startDownloadZip(zip_url:String) {// 获取zip文件名let lastPathComponent = zip_url.components(separatedBy: "/").last ?? ""MWNetworkHelper.downloadFile(url: zip_url,file: "giftPool",fileName: lastPathComponent) { progress in} completion: {[weak self] path, error inguard let self = self else { return }if let path = path {MWLogHelper.info("下载zip成功 path:\(path)", context: "MWGiftPoolManager")self.startUnZipFile(zipURL: path)} else {MWLogHelper.error("下载zip失败 err:\(error?.description ?? "")", context: "MWGiftPoolManager")}}}

此时下载完成时一个zip包,借助Zip进行解压,解压完成之后获取到json,构建数据模型,并将json输入写入到document文件夹,保存相对路径。

    /// 开始解压private func startUnZipFile(zipURL: URL) {do {let unzipUrl = try Zip.quickUnzipFile(zipURL)// 获取文件名let lastPathComponent = zipURL.lastPathComponent.components(separatedBy: ".").first ?? ""MWLogHelper.info("解压zip成功 path:\(unzipUrl)", context: "MWGiftPoolManager")let jsonURL = unzipUrl.appendingPathComponent("\(lastPathComponent).json")MWLogHelper.info("拼接路径 path:\(jsonURL)", context: "MWGiftPoolManager")// 将文件路径存储起来(document以后)let filePath = lastPathComponent.appending("/\(lastPathComponent).json")MWUserDefaultsAppHelper.giftPoolJsonPath = filePathlet jsonData = try Data(contentsOf: jsonURL)let json = try JSONSerialization.jsonObject(with: jsonData, options: .mutableContainers)if let jsonDict = json as? [String:Any] {self.jsonDict = jsonDictself.convertModel(jsonDict: jsonDict)}} catch {MWLogHelper.error("解压zip失败 err:\(error.localizedDescription)", context: "MWGiftPoolManager")}}

json数据转哈希表

从上面的代码中我们还可以看见一个比较重要的方法covertModel(),该方法接收的就是礼物池的原始数据,然后我们通过遍历礼物池下的gifts礼物列表来构建礼物的数据模型。模型构建完成之后,我们使用键值对的形式将礼物的数据模型和礼物id成对的保存到表中。

    /// 礼物池(键值对形式)public var giftPoolMap:[Int:MWGiftModel] = [:]
    /// 转modelprivate func convertModel(jsonDict: [String:Any]) {if let giftPools = jsonDict["gifts"] as? [[String:Any]] {// 遍历giftpools创建一个字典for giftDict in giftPools {let giftModel = MWGiftModel(JSON: giftDict)guard let giftId = giftModel?.giftId else {continue}giftPoolMap[giftId] = giftModel}}giftPoolCallback?(giftPoolMap)MWGiftLoader.shared.startLoadGift(giftPoolMap: giftPoolMap)MWLogHelper.debug("转成模型 :\(giftPoolMap.count)", context: "MWGiftPoolManager")}

方便后续从礼物池中直接读取礼物模型。

结语

在本篇博客中,我们探讨了直播应用中礼物面板的核心架构设计,以及如何通过礼物池实现高效的数据加载与更新。这种基于本地缓存和远程更新机制的方案,不仅提升了应用的响应速度,还有效降低了网络请求对性能的影响。

然而,礼物池只是整个礼物实现的一部分,为了真正的完成礼物展示,还需要处理礼物面板的数据解析,动态筛选,以及与礼物池的高效匹配。在下一篇博客中,我们将深入解析礼物面板的实现细节。

http://www.hkea.cn/news/954814/

相关文章:

  • 洛阳seo外包公司费用seo的中文意思
  • 政府网站建设遵循的原则seo网站内容优化
  • java做网站具体步骤邵阳seo优化
  • 自己做的网站如何放进服务器今天今日头条新闻
  • 男装网站的网站建设背景惠州seo按天计费
  • 如何快速提高网站排名互联网项目推广
  • icp备案网站名称更改成都网站设计
  • 企业网站建设需求分析seo排名资源
  • python基础教程雪峰东莞搜索seo网站关键词优化
  • b2b网站开发供应商小程序开发教程全集免费
  • 用自己的手机做网站外链网站是什么
  • 市场调研公司介绍网站推广优化公司
  • 玉溪人民政府网站建设现状新网站seo
  • 湖南餐饮网站建设2023北京封控了
  • 重庆网站设计人员外贸网站搭建推广
  • 局域网内的网站建设西安网站建设公司排名
  • 普通网站报价多少中南建设集团有限公司
  • 蚌埠做网站哪家好全网营销国际系统
  • 沈阳市网站制作谷歌香港google搜索引擎入口
  • 做美食网站的背景高端网站建设制作
  • 文件什么上传到wordpress泉州seo技术
  • 网站地址地图怎么做网页制作的软件有哪些
  • 如何用万网建设网站口碑营销策划方案
  • 做网站的基础架构东莞seo建站公司
  • 嘉兴做网站的哪家好龙岗网站制作
  • 论坛做网站好吗百度官方网页
  • 微信开发者工具获取系统日期seo优化一般包括
  • 怎么用文本做网站百度排行榜风云榜
  • 未来网站开发需求多搜索网站有哪几个
  • 网站建设 成都郑州高端网站制作