高性能的聊天页面解决方案 对聊天列表的高度封装,可灵活配置页面样式
聊天界面其实大同小异,所以这里封装了一个聊天的组件,使用CoreText和手动代码布局,尽量实现简单,通用,高效,易于维护。
CDChatListView: UITableView 视图,聊天页面主体
CDBaseMsgCell: 实现消息气泡基本视图
CDTextTableViewCell、CDImageTableViewCell、CDAudioTableViewCell: 继承自CDBaseMsgCell,实现响应功能。 CDSystemTableViewCell: 特殊消息气泡,实现系统通知
CellCaculator: tableview布局计算,并提前渲染cell
ChatConfiguration: chatlist配置类组,UI定制,及资源等
CDLabel: 富文本标签 CDChatInputBox: 输入框封装组件
支持至iOS 11
pod 'CDChatList'
#import <CDChatList/CDChatList.h>
ChatHelpr负责ChatHelpr的UI配置,及组件的资源文件设置
UI配置及资源文件都有默认,所以无需自定义的话,就可以跳过组件的配置
CDChatListView *list = [[CDChatListView alloc] initWithFrame:self.view.bounds]; list.msgDelegate = self;self.listView = list; [self.view addSubview:self.listView];
CDChatList会将视图控制器automaticallyAdjustsScrollViewInsets及contentInsetAdjustmentBehavior设为NO及Never,并适应导航栏高度
可以使用自己的消息模型,消息模型需遵守MessageModalProtocal,实现相关属性
消息列表请求加载更多消息
-(void)chatlistLoadMoreMsg: (CDChatMessage)topMessage callback: (void(^)(CDChatMessageArray))finnished;
消息中的点击事件
-(void)chatlistClickMsgEvent: (ChatListInfo *)listInfo;
添加新的数据到底部
-(void)addMessagesToBottom: (CDChatMessageArray)newBottomMsgArr;
更新数据源中的某条消息模型(主要是为了更新UI上的消息状态)
-(void)updateMessage:(CDChatMessage)message;
// 发{ MessageModal *modal; } -(void)send{ modal = [[MessageModal alloc] init]; modal.msgState = CDMessageStateSending; modal.createTime = ...; modal.msg = ...; modal.msgType = ...; [chatList addMessagesToBottom: modal]; } -(void)sendCallBack:(BOOL)isSuccess{ modal.msgState = isSuccess; // 此处应处理成枚举 [chatList updateMessage: modal]; }// 收-(void)receivedNewMessage:(MessageModal *)modal{ [chatList addMessagesToBottom: modal]; }
消息列表被下拉时,触发此回调
-(void)chatlistLoadMoreMsg: (CDChatMessage)topMessage callback: (void(^)(CDChatMessageArray))finnished { // 根据topMessage 获取更多消息 NSArray *msgArr = [self getMoreMessageFrom: topMessage amount: 10]; callback(msgArr); }
目前消息体重处理了 文本点击 及 图片点击 事件
-(void)chatlistClickMsgEvent: (ChatListInfo *)listInfo{ if (listInfo.eventType == ChatClickEventTypeTEXT){ // 点击的文本 listInfo.clickedText // 点击的文字位置 防止有相同的可点击文字 listInfo.range // 被点击文本的隐藏信息 e.g. <a title="转人工" href="doTransfer"> listInfo.clickedTextContent } else if (listInfo.eventType == ChatClickEventTypeIMAGE){ // 图片 listInfo.image // 图片在tableview中的位置 listInfo.msgImageRectInTableView } }
自定义消息内容匹配
主要内容:1.难题与方案,2.具体措施,3.九种技术架构1.难题与方案 1、亿级流量电商网站的商品详情页系统架构 面临难题:对于每天上亿流量,拥有上亿页面的大型电商网站来说,能够支撑高并发访问,同时能够秒级让最新模板生效的商品详情页系统的架构是如何设计的? 解决方案:异步多级缓存架构+nginx本地化缓存+动态模板渲染的架构 2、redis企业级集群架构 面临难题:如何让redis集群支撑几十万QPS高并发+99.99%高可用+TB级海量数据+企业级数
uniapp使用uView的骨架屏导致页面高度报错问题。 报错信息:TypeError: Cannot read property 'height' of undefined 组件源文件代码片段如下: 打印出res是个空数组,因此找不到res【0】【0】.height
即时聊天是工作沟通中必不可少的工具。钉钉的即时聊天具有消息一触即达、身份和信息双重安全保障、群聊可精细化管理等特性,帮助你的企业实现工作沟通与生活聊天分离,让工作重回专注。 全员群管理 全员群开启 ● 团队创建完成后,默认会开启全员群。 全员群设置 ● 管理员可以登录管理员后台,对全员群进行设置。 登录管理员后台,点击通讯录中企业名称右侧的设置 查看全员群信息 设置全员群群主(默认是管理员) 修改
本文向大家介绍聊聊MySQL的COUNT(*)的性能,包括了聊聊MySQL的COUNT(*)的性能的使用技巧和注意事项,需要的朋友参考一下 前言 基本职场上的程序员用来统计数据库表的行数都会使用count(*),count(1)或者count(主键),那么它们之间的区别和性能你又是否了解呢? 其实程序员在开发的过程中,在一张大表上统计总行数是非常耗时的一个操作,那么我们应该用哪个方法统计会更快呢?
本文向大家介绍JavaScript仿聊天室聊天记录,包括了JavaScript仿聊天室聊天记录的使用技巧和注意事项,需要的朋友参考一下 本文实例为大家分享了js仿聊天室聊天记录的具体代码,供大家参考,具体内容如下 参考样式(css自定义聊天窗口样式):http://xiazai.jb51.net/201612/yuanma/css3chatstyle(jb51.net).rar 功能描述: 1.
本文向大家介绍Android编程中聊天页面背景图片、标题栏由于键盘引起问题的解决方法,包括了Android编程中聊天页面背景图片、标题栏由于键盘引起问题的解决方法的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了Android编程中聊天页面背景图片、标题栏由于键盘引起问题的解决方法。分享给大家供大家参考,具体如下: 在一个群里面有人问到 聊天页面由于键盘弹出来,导致自定义的标题栏不见和背景图