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

家装企业网站系统下载什么网站吸引流量

家装企业网站系统下载,什么网站吸引流量,在线建站系统,做网站还有用引言 在现代iOS应用开发中#xff0c;处理大规模数据是一个常见的挑战。尤其实在直播项目中#xff0c;礼物面板作为展示用户互动的重要部分#xff0c;通常需要实时显示海量的礼物数据。这些数据不仅涉及到不同的区域、主播的动态差异#xff0c;还需要保证高效的加载与渲… 引言 在现代iOS应用开发中处理大规模数据是一个常见的挑战。尤其实在直播项目中礼物面板作为展示用户互动的重要部分通常需要实时显示海量的礼物数据。这些数据不仅涉及到不同的区域、主播的动态差异还需要保证高效的加载与渲染以提供流畅的用户体验。 本篇博客将以直播应用中的礼物面板为例深入探讨如何高效地管理和处理这些庞大的数据。我们将分享一种基于“礼物池”设计的解决方案从服务端下载并解压存储数据再根据实时的面板数据提取礼物信息的方式确保数据的高效存取与更新。同时还将讨论如何通过合理的本地缓存和更新机制进一步提升应用性能并优化用户体验。 如果你也在处理类似的大数据问题或者正在开发类似的直播应用本篇博客将为你提供实用的思路和解决方案。 架构介绍 上面所展示的礼物面板中的所有礼物数据大概有2-4M这对于一个请求来说应该算是一个非常大的数据量而由于针对不同地区不同的主播所展示的礼物也不同那么我们就可以需要频繁的来请求整个礼物面板的数据每次都请求这么大的数据显然这并不理智。为此我们可以考虑将它分割成两部分礼物池和礼物面板。 礼物池礼物池内存放的是所有的礼物该数据由一个接口下发为固定数据几乎不会变动出发有新类型的礼物加入。礼物面板根据层级返回每个一级tab对应下的二级tab而二级tab下只需要包含礼物的id。 礼物池的数据结构如下 截图中只展示了礼物列表中的一个礼物而且数据并没有完全展示出来那这组json来说一共有1600个这样的礼物整个礼物池大小为3.8M。 礼物面板的数据结构如下 我们抛开一级tab直接看二级tab下的gifts里面只保存了礼物的id。这也就大大减小了礼物面板的数据大小、获取到礼物的id之后再从礼物池中读取礼物的完整数据。这样即使频繁请求礼物面板接口也不会造成很大性能影响。 礼物池的存储与更新机制 礼物池json文件的压缩包是通过一个接口获取的该接口会返回礼物池的压缩文件路径以及礼物池的当前版本号。 等获取到该接口的数据之后我们需要做的有三件事 对比礼物版本号与当前本地礼物版本号如果相等则不需要更新json文件直接加载本地json。否则将新的礼物池版本号进行保存。开始下载新的礼物池压缩包。 /// 请求礼物池数据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.eeditor.cn/news/121982/

相关文章:

  • 在国外的网站做推广电脑怎么直接卸载wordpress
  • 备案 网站下线网站外链接自己可以怎么做
  • 专业的网站建设专业平台郑州网站制作网
  • wordpress 本地视频链接优化方案丛书官网
  • 专业做app下载网站有哪些节约化网站群建设情况
  • 西安做网站选哪家好互动企业展厅设计公司
  • 提供商城网站制作五个h5制作网站
  • 辽源网站建设泰安网络平台
  • 怎么做夜场网站html5笑话网站源码
  • 淘宝价格网站建设wordpress 翻页没内容
  • 深圳企业网站哪家好wordpress首页显示链接地址
  • 怎么自助建站攻击网站常用方法
  • 深圳网站制作哪家专业重庆互联网怎么样
  • 公司网站域名到期网站设计开发平台
  • 湖北省住房城乡建设厅网站防蚊手环移动网站建设
  • 网站建设丩金手指排名壹陆广告设计公司朋友圈文案
  • 网站建设教程在线做系统网站
  • 杭州做宠物网站的公司哪家好好康的网站代码
  • 青岛市医疗保险网站网页设计与制作教程知识点总结
  • 响应式网站建设需要注意什么给我免费观看片在线观看
  • 企业网站seo网址自己做的手工放在哪个网站卖
  • 威海建设集团的网站是什么百度资源站长平台
  • 广东粤建设计院网站电子商务网站的运营一般需要做哪些准备
  • 宁波市建设工程监理协会网站甘肃省城乡和建设厅网站
  • 加强学院网站的建设与管理wordpress能找工作吗
  • 网站 备案 注销 影响海外运营工作内容
  • 重庆网上房地产备案价企业网站seo推广
  • iis添加网站访问权限wordpress title修改
  • 网站建设实施方案pptwordpress做游戏网站
  • 同个主体新增网站备案八零婚纱摄影工作室网站