ios聊天demo

自己写了个聊天界面,因为以前做开发的时候开发过聊天功能,现在把其中的聊天模块分离出来,cellOptimize分支代码对数据源的结构体作了优化。

项目运行:

        该项目集成了一般的聊天功能,包含文字、图片、音频,通讯使用xmpp协议,代码里面也有xmpp的消息接收、消息发送。本地使用coredata保存聊天的数据:

数据库:


Mes实体类

author表示所有者

content表示聊天内容,若是文字保存文字,若是图片或者音频保存在服务器的链接。

date表示消息的日期

from表示发送方

to表示接收方

type表示消息类型,包括time时间戳、图片、音频、文字,几类消息类型使用type数字区分。

type结构体:


消息类型枚举类

配置文件:

配置文件config.plist里配置了本身用户的名字、头像,好友用户的名字、头像。


config.plist配置文件

该项目最重要的Vc是chatVc,chatVc是一个tableView,下拉时从数据库里拉取聊天数据,数据发送后将发送的数据保存在本地数据库(图片和音频是发送后直接保存到数据源,发送完成后才保存到本地数据库)。

音频的录制使用AVAudio,录制成功后需要转码,因为录制的caf文件格式不能正常播放,这里使用的是c++的一个库叫lame,将文件转成mp3格式后再上传。

富文本的绘制代码使用的是drawRect,表情是本地自定义了一些表情图片,发送的时候解析文本,将是表情图片的地方使用表情图片绘制

后台地址:

      图片的上传需要有一个上传接口,我用的是AFN表单上传,需要配置图片上传的地址,在pch预编译文件里:

image上传地址

难点:

       cell的绘制,文字和音频展示使用了重用,图片展示使用cellfor方式。图片的展示我考虑的是在上传和下载的时候在图片控件上添加了一个遮罩和一个上传/下载的百分比,上传/下载完成后去掉遮罩和这个百分比view,百分比的数据保存在数据源里,每次在绘制的时候去重新绘制遮罩和百分比(上传/下载完成后不需要绘制这两个view),这样重用该类型的cell应该是没有问题的,但是在实际编码中发现每次遮罩和百分比的展示都有问题。发现这个是cell重用的问题,下载或者上传图片的operation对cell的进度progress进行操作,如果有滑动,这些operation又会关联到不同的cell,这样就会导致一个展示的cell的进度条同时有几个 operation去更新它的progress进度,造成进度跳跃的效果。我的解决方案就是下载的cell不重用,思路是对这两种情况的图片cell使用两种identifier,一种是下载/上传完成的picFinish_identifier,这个作为重用的cell,而未下载/上传完成的cell使用picNotFinish_identifier,这种类型的cell不重用,而且在图片下载期间避免这种cell被销毁,使用一个字典对象将这些正在下载/上传完成的图片进行存储,这样就避免了同一个operation去同时影响几个cell的progressView问题。下载完成后再将这些picNotFinish_identifier的cell从字典对象里删除就行了。这样基本上解决了进度条跳跃的问题。思路是这个思路,实践起来出了几个问题,主要是下载/上传完成后生成的picNotFinish_identifer的cell从字典对象里remove掉后cell并没有被释放掉,这一点的确很难理解是什么原因,因为直接使用cellfor生成cell的方式cell是能够被释放掉的,可能是代码哪里没有考虑到。

优化之路:

主要是对cell里面对图片操作的相关地方进行适当的优化,缩小图片尺寸,再将图片添加到uiimageView,这样能使内存消耗明显降低。

代码地址:https://github.com/dinner/chat

该repo有两个分支,cellOptimize是最新优化的一个分支,将cell优化了下,以前的cell太冗余复杂,不够简洁,数据源也重新设计了下。有兴趣的朋友可以一起研究下。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,670评论 5 460
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,928评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,926评论 0 320
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,238评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,112评论 4 356
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,138评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,545评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,232评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,496评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,596评论 2 310
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,369评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,226评论 3 313
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,600评论 3 299
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,906评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,185评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,516评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,721评论 2 335

推荐阅读更多精彩内容