iOS直播间聊天室遇到的问题

Question:

1.刷新直播间消息机制该用哪种方法?哪一种更加合适?

2.聊天室该如何图文混排?

3.聊天室出现特殊字符临界点不换行?高度计算错误?

4.聊天室该如何加载网络图片?

5.聊天室如何优化?

6.交互时刷新消息经常出现越界情况,导致崩溃?

7.聊天室出现阿拉伯文&中文&数字&英文等类似情况如何处理?

...

以上这些问题我相信做过聊天室直播间的肯定或多或少遇到过,那么本编文章就为了解决这些问题而来,底部提供Demo⬇️。

1.刷新直播间消息机制该用哪种方法?哪一种更加合适?

聊天室刷新分为两种:
一:采用来一条消息刷新一条消息,适用于小主播和人气较少的直播间。优点就是可以快速的查看到发言记录,给人丝滑流畅感,缺点就是刷新过于频繁,消耗性能。

image.png

直接刷新.gif

二:定时刷新,适用于大主播或某段活动时间内用户发言特别频繁时间段,假设一秒钟接收到几十条消息时你直接一条条刷新是毫无意义的,不仅影响性能而且用户也看不清。所以这种情况可以选择弄个定时器,每0.5秒刷新一次。至于多久刷新一次,你可以根据主播人气,观看人数,发言速度来调整。

image.png

0.5秒刷新一次.gif

通过对比,二者都是每秒接收到30条消息时,一条条刷新和定时刷新所消耗的性能非常明显。
如何选择,各位自行斟酌。

2.聊天室该如何图文混排?

如果在子线程生成我们的富文本,这个时候你肯定不可以在子线程创建UIimageView这些,然后转UIimage,我个人有几个技巧:
一:聊天肯定会带有等级系列,拿我的直播来说,现在有0-100级,我个人写了一个等级生成器,通过业务生成每个等级段所对应文字+图片+等级+渐变色形成view,然后我们启动APP时,通过view转image,内存就会保存有0-100张图片,所占300k左右而已。那么下次用的时候,直接传入等级获取对应的UIimage。

+ (instancetype)sharedInstance {static EWLevelManager *instance = nil;static dispatch_once_t onceToken;dispatch_once(&onceToken, ^{instance = [[EWLevelManager alloc] init];instance.data = [NSMutableDictionary dictionary];});return instance;
}- (void)setup {[self.data removeAllObjects];for (NSInteger i = 0; i <= 100; i++) {// NDLeveBgView就是我的等级生成器,返回view// 启动app我们调用一次这个方法,然后内存就有生成0-100等级图片NDLeveBgView *view = [[NDLeveBgView alloc] init];view.frame = CGRectMake(0, 0, 30.0, 14.0);view.layer.cornerRadius = 2;view.layer.masksToBounds = YES;view.isShadeLv = YES;view.level = i;[self.data setObject:[self convertCreateImageWithUIView:view] forKey:[NSString stringWithFormat:@"%li", (long)i]];}//    NSMutableData *data = [[NSMutableData alloc]init];
//    NSKeyedArchiver *archiver = [[NSKeyedArchiver alloc]initForWritingWithMutableData:data];
//    [archiver encodeObject:self.data forKey:@"talkData"];
//    [archiver finishEncoding];
//    NSLog(@"查看byte = %lu", (unsigned long)data.length);
}- (UIImage *)imageForLevel:(NSInteger)Level {return [self.data objectForKey:[NSString stringWithFormat:@"%li", (long)Level]];
}/** 将 UIView 转换成 UIImage */
- (UIImage *)convertCreateImageWithUIView:(UIView *)view {//UIGraphicsBeginImageContext(view.bounds.size);UIGraphicsBeginImageContextWithOptions(view.bounds.size, NO, [UIScreen mainScreen].scale);CGContextRef ctx = UIGraphicsGetCurrentContext();[view.layer renderInContext:ctx];UIImage *newImage = UIGraphicsGetImageFromCurrentImageContext();UIGraphicsEndImageContext();return newImage;
}

至于图片如何转富文本我就不多赘述了,这种没啥可说的,都在demo中。

3.聊天室出现特殊字符临界点不换行?高度计算错误?

我想肯定有人遇到过这个问题,当我们使用UILabel时,根据消息生成的富文本,高度计算得明明很正确,但就是不换行!!当我们在测试的时候明明运行一切都正常,但是到了线上就出现不换行,高度计算错误等等系列问题。

我可以很明确的告诉大家,这就是UILabel的问题,他在不同系统版本表现不一样,经过我多次测试,曾经一度让我怀疑是不是我的问题,但是后来我换了YYLabel后,一切都清净了,所以抛弃UILabel吧,它在表达复杂的文本时,总是不那么如意。
跟我说一句:YYKit牛逼🐂!!!

可能有同学反驳,其实我也想证明是我的问题,如果有同学用UILabel做的直播间聊天室,希望不吝赐教。

4.聊天室该如何加载网络图片?

这个问题其实也好解决。
当我们生成礼物消息富文本时,先用礼物缩略的占位图替代,同时使用SD下载该图片,下载完了以后重新生成该富文本,接着通过代理回调去刷新该cell。

case NDSubMsgType_Gift_Text: {   // 礼物弹幕(文本)消息// 下载标签图片[self downloadTagImage];// 下载礼物图片[self downloadGiftImage];self.bgColor = NormalBgColor;[self Gift_Text];}break;/** 下载礼物缩略图 */
- (void)downloadGiftImage {NSString *urlStr = self.msgModel.giftModel.thumbnailUrl;if (!urlStr || urlStr.length < 1) {return;}if (self.finishDownloadGiftImg) {return;}self.finishDownloadGiftImg = YES;// 1. 如果本地有图片self.giftImage = [self cacheImage:urlStr];if (self.giftImage) {return;}// 2. 下载远程图片NSURL *url = [NSURL URLWithString:urlStr];EWWeakSelfid sdLoad = [[SDWebImageManager sharedManager] loadImageWithURL:url options:0 progress:^(NSInteger receivedSize, NSInteger expectedSize, NSURL * _Nullable targetURL) {} completed:^(UIImage * _Nullable image, NSData * _Nullable data, NSError * _Nullable error, SDImageCacheType cacheType, BOOL finished, NSURL * _Nullable imageURL) {if (image){// 刷新UIweakSelf.giftImage = image;// 更新属性文字[weakSelf downloadTagImageFinish];}}];[self.tempLoads addObject:sdLoad];
}- (void)downloadTagImageFinish {// 更新属性文字[self msgUpdateAttribute];// 通知代理刷新属性文字if (self.delegate && [self.delegate respondsToSelector:@selector(attributeUpdated:)]) {[self.delegate attributeUpdated:self];}
}/** 消息属性文字发生变化(更新对应cell) */
- (void)msgAttrbuiteUpdated:(NDMsgModel *)msgModel {NSInteger row = [self.msgArray indexOfObject:msgModel];if (row >= 0) {[self.tableView reloadRowsAtIndexPaths:@[[NSIndexPath indexPathForRow:row inSection:0]] withRowAnimation:UITableViewRowAnimationNone];if (row == self.msgArray.count - 1) {[self scrollToBottom:YES];}}
}

以上代码都是关键部分,更详细可以对照demo。

5.聊天室如何优化?

聊天室的优化其实也就是UITableView的优化:

一:我们所有的cell通过复用,每一种消息类型对应不同cell。

image.png

二:所有的消息所需要的背景颜色,富文本,高度等等都用模型记录。

image.png

三:cell高度缓存,每次都从我们的模型读取,更加高效快捷。

6.交互时刷新消息经常出现越界情况,导致崩溃?

崩溃的原因大多数都在同时对同一个数组操作、插入indexPaths出现问题等。
一:如何保证同一时间数组只执行一种操作?
加锁
锁有好多种,有自旋锁、信号量、递归锁、互斥锁等等
自旋锁性能最高,但是经过苹果确认是有问题存在的,所以你可以选择其他类型。
这里我选择的是互斥锁:

#pragma mark - 消息追加
- (void)addNewMsg:(NDMsgModel *)msgModel {if (!msgModel) return;pthread_mutex_lock(&_mutex);// 消息不直接加入到数据源[self.tempMsgArray addObject:msgModel];pthread_mutex_unlock(&_mutex);if (_reloadType == NDReloadLiveMsgRoom_Direct) {[self tryToappendAndScrollToBottom];}
}/** 追加数据源 */
- (void)appendAndScrollToBottom {if (self.tempMsgArray.count < 1) {return;}pthread_mutex_lock(&_mutex);// 执行插入.....代码块pthread_mutex_unlock(&_mutex);...代码块//清空消息重置
- (void)reset {pthread_mutex_lock(&_mutex);...代码块pthread_mutex_unlock(&_mutex);
}
}

更多详见demo。

二:插入indexPaths出现越界问题,其实这个问题的产生也是因为我们对数组同时操作而导致的,如果你解决了数组的问题,那么这个问题也迎刃而解。

7.聊天室出现阿拉伯文&中文&数字&英文等类似情况如何处理?

这个问题非常有意思!具体可参考这篇文章
因为阿拉伯文、希腊文等系列语言是强语言,并且从右向左排列,而我们的中文也属于强语言,但是从左向右排列。当这二者碰撞到一起会怎么样呢?
到底是遵从我们的规则还是遵从阿拉伯文的规则?

我这里做的是强制按照中文规则排版。

// 强制排版(从左到右)attribute.yy_baseWritingDirection = NSWritingDirectionLeftToRight;attribute.yy_writingDirection = @[@(NSWritingDirectionLeftToRight | NSWritingDirectionOverride)];// 强制排版(从左到右)paraStyle.alignment = NSTextAlignmentLeft;paraStyle.baseWritingDirection = NSWritingDirectionLeftToRight;

如果大家觉得有什么问题的,可以评论指出。

最后就是我们的demo了,如果觉得可以的希望点个star哦,Github

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/66074.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

chatgpt赋能python:Python下载之后怎么用:详细教程

Python下载之后怎么用&#xff1a;详细教程 Python作为一种著名的编程语言&#xff0c;已经成为众多程序员和开发者的首选。因此&#xff0c;如果您也想开始使用 Python 来进行编程&#xff0c;那么下一步应该是下载和安装Python。但是&#xff0c;下载完 Python 之后&#xf…

chatgpt赋能python:PythonSoup对于爬虫程序员来说为什么如此重要

Python Soup 对于爬虫程序员来说为什么如此重要 介绍 Python是现代编程世界中最广泛使用的语言之一。它是一个高级编程语言&#xff0c;可用于许多应用程序&#xff0c;从机器学习到游戏开发再到网络爬虫。对于网络爬虫&#xff0c;Python Soup是非常重要的工具之一。Soup是一…

chatgpt赋能python:Python编程输入法推荐使用什么

Python编程输入法推荐使用什么 如果你是一名Python程序员&#xff0c;那么你一定需要一个高效的输入法来帮助你快速编写代码。在这篇文章中&#xff0c;我们将会介绍一些Python编程输入法的选择&#xff0c;并分析它们的优缺点&#xff0c;最终为你提供最佳建议。 Sublime Te…

chatgpt赋能python:Python下载好了怎么用

Python 下载好了怎么用 Python是一种高级编程语言&#xff0c;它具有简单易学、跨平台、可扩展性以及丰富的第三方库等优点&#xff0c;成为了全球最受欢迎的编程语言之一。在这篇文章中&#xff0c;我们将介绍如何下载 Python 并演示如何使用。 下载 Python Python 官网提供…

如何使用python来进行回归分析

文章主要介绍两种常见的回归分析方法&#xff0c;以及其对应的Python实现操作。 目录: 什么是回归分析 为什么使用回归分析 回归分析技术有哪些 使用Python实现回归分析 什么是回归分析 在统计学中&#xff0c;回归分析&#xff08;regression analysis)指的是确定两种或两种以…

用stata做面板数据回归分析基础作业

目录 1.导入数据集 2.面板数据有关信息 3.混合回归 4.随机效应模型 4.1随机效应模型or混合回归模型的选择&#xff1a;LM检验 4.2随机效应模型&#xff1a;两种估计方法 A.FGLS法&#xff1a;广义离差模型 B.MLE法&#xff1a;极大似然估计 4.3双向随机效应模型 5.固定…

2月8日第壹简报,星期三,农历正月十八

2月8日第壹简报&#xff0c;星期三&#xff0c;农历正月十八坚持阅读&#xff0c;静待花开1. 土耳其强震已致土叙两国超5000人遇难、两万余人受伤&#xff0c;土总统宣布&#xff1a;实施国家紧急状态3个月&#xff1b;中国救援队82名队员赴土耳其实施国际救援&#xff0c;携搜…

“我经历了长达十年的‘洗脑’:现代 Web 开发,非 JavaScript 框架不可!”

【CSDN 编者按】说起 Web 开发&#xff0c;总是很容易想起 JavaScript&#xff0c;很少有人质疑过它的性能和必要性&#xff0c;而本文作者则认为&#xff1a;“这是一种洗脑”。 原文链接&#xff1a;https://www.spicyweb.dev/the-great-gaslighting-of-the-js-age/ 未经授权…

语音笔记APP哪个好 用它直接录音并整理很方便

很多人在记笔记的时候&#xff0c;喜欢用录音来辅助以便提高效率&#xff0c;尤其是当领导临时布置了一个比较复杂的任务或者听到了一段包含重要信息的话&#xff0c;你又来不及打字&#xff0c;那么就可以采取录音的方法&#xff0c;能够在一定程度上避免遗漏某些重要内容。录…

当ChatGPT应用在汽车行业,具体有哪些场景?

​ ChatGPT有潜力彻底改变汽车行业并将其提升到新的高度。在ChatGPT的加持下&#xff0c;该行业的多个领域都将取得重大变化。 利用ChatGPT作更高级的虚拟助理 你可能用过现有的虚拟助理&#xff0c;它们一系列的回复有时候让人不得不感叹一句“人工智障”&#xff01;然而&a…

chatgpt赋能python:Python如何办公自动化

Python如何办公自动化 近年来&#xff0c;Python的应用越来越广泛&#xff0c;不仅在数据分析和机器学习领域得到了广泛的应用&#xff0c;还在办公自动化方面也越来越得到人们的关注。Python语言强大的数据处理能力、API调用能力和自动化能力&#xff0c;为我们提供了一种有效…

chatgpt赋能python:Python怎么办公自动化?

Python怎么办公自动化&#xff1f; 在现代社会&#xff0c;信息技术已经为我们带来了诸多便利。在工作和生活中&#xff0c;我们不仅需要处理许多数据&#xff0c;还需要按照一定流程进行操作。这样的任务可能非常琐碎而重复&#xff0c;让人感到疲惫。而采用Python进行自动化…

智能排班系统 【开源说明】

文章目录 引言说明讲讲开源开源要做什么了解开源协议项目的信息脱敏写好项目说明文档修改.gitignore 项目不完善点说明管理系统前端页面自适应做得不好部分页面体验不好 管理系统后端接口缺乏数据校验数据管理接口查询不够完善接口可以更加完善 开源仓库地址智能排班系统相关文…

借力表单设计器开源,助力实现办公自动化发展!

数字化转型是当今的发展潮流&#xff0c;有越来越多的企业对于数据管理和办公自动化发展深有体会&#xff0c;也习惯于采用低代码开发平台来实现更高效率的办公。在传统表单失去发展优势的当下&#xff0c;借力表单设计器开源工具&#xff0c;可以给企业带来提质增效的办公效率…

chatgpt赋能python:如何利用Python进行自动化办公

如何利用Python进行自动化办公 在现代办公环境中&#xff0c;自动化成为了一种趋势。利用计算机程序自动处理重复性劳动&#xff0c;可以提高生产效率和工作质量&#xff0c;同时也能够让工作更加轻松。Python作为一种常用的编程语言&#xff0c;在自动化办公中发挥了重要作用…

如何实现办公自动化?

办公自动化&#xff08;OA&#xff09;允许数据在没有人工干预的情况下流动。由于人工操作被排除在外&#xff0c;所以没有人为错误的风险。如今&#xff0c;办公自动化已经发展成无数的自动化和电子工具&#xff0c;改变了人们的工作方式。 办公自动化的好处 企业或多或少依…

Paper Reading:《Zeno:An Interactive Framework for Behavioral Evaluation of Machine Learning》

一枚科研小白的论文的阅读笔记&#xff0c;主要是为了记录自己的学习过程&#xff0c;前期读论文很多时候还是停留在解决语言障碍的阶段… 这篇文章也是极其粗浅的阅读 文章目录 一.论文简介二.常识、语料、术语积累1.术语2.生词3.表达积累 三.工作流总结 一.论文简介 论文放出…

最新RLHF拯救语言模型「胡说八道」!微调效果比ChatGPT更好,两名华人共同一作...

西风 发自 凹非寺量子位 | 公众号 QbitAI RLHF&#xff08;基于人类反馈的强化学习&#xff09;的一大缺点&#xff0c;终于被解决了&#xff01; 没错&#xff0c;虽然RLHF是大语言模型“核心技巧”之一&#xff0c;然而这种方法也存在一个问题—— 它只会判断生成文本的整体效…

幼儿-综合素质【2】

1.材料分析题&#xff1a;材料&#xff1a;一天早上&#xff0c;陈一航蹦蹦跳跳地走进教室&#xff0c;在搬椅子时&#xff0c;他发现旁边小朋友的椅子上有一本书没有收好&#xff0c;便大声喊道&#xff1a;“余老师&#xff0c;这儿有一本书没有收。”余老师笑看说&#xff1…

教师资格考试--中学综合素质

综合素质 教育观 素质教育的基本内涵★★ 素质教育以提高国民素质为根本宗旨素质教育是面向全体学生的教育素质教育是促进学生全面发展的教育素质教育是促进学生个性发展的教育素质教育是以培养学生的创新精神个时间能力为重点的教育 记忆口诀&#xff1a;提素个性创两全 …