iOS 即时聊天界面优化心得

         最近在开发一个手机直播APP,其中除音视频外最重要的要数即时聊天了。这段时间以来我一直在寻求一种占用资源少,性能高的即时聊天信息展示模式。在经过了几个版本的迭代后最终找到了一种方式,下面具体介绍一下。

1.关于图文混排

一开始使用的是富文本,图片是按一下方式处理为富文本

NSTextAttachment *attch = [[NSTextAttachment alloc] init];

attch.image = [UIImage imageNamed:@“imageOne.png”];

attch.bounds = CGRectMake(0, 0, 32, 32);

NSAttributedString *string = [NSAttributedString attributedStringWithAttachment:attch];

NSMutableAttributedString* content = [[NSMutableAttributedString alloc]initWithString:@" testing”];

[content appendAttributedString:string];

self.textLabel.attributedText = content;

        如果用到的图片过多,这样做会导致滚动的时候非常卡。这是因为这样图文混排的时候是在主线程进的,若图片太多,cell进行复用,每次滑动都会使cell重新绘制。最好的方法是改成coreText来进行图文混排。自定义一个label,在label的drawrect 方法里面对它进行重绘。这个时候绘制是放在子线程的,性能会好很多。至于coretext如何使用我已经在上一篇文章 《tableview性能优化之coreText》介绍了,虽然我最后放弃了tableview但是coretext 没变。

2.关于控件

         关于即时聊天信息的展示方式,大家可能想到的是tableview,我也一样,前期用tableview进行了开发。在使用tableview的时候我还为了每个cell的高度计算而大费周张用了一个第三方框架UITableView+FDTemplateLayoutCell(后来发现不用这个,直接用富文本高度计算方法就可以搞定),这个库计算出来的cell高度的确准确。但即时聊天几乎每个cell高度都可能会发生变化,再加上图文混排等没处理好,导致以每秒5条的速度发送信息时内存不断飙升。后来我将tableview改为collectionview后,性能明显提升了很多。以每秒5条信息的速度发送信息,cpu占用保持在25%左右,而且这25%里面还包括视频推流的cpu占用,滚动起来也不不卡。

3.cell高度计算

         collectionview 计算cell的高度就简单了,用不着什么第三方库,直接在(CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout*)collectionViewLayout sizeForItemAtIndexPath:(NSIndexPath *)indexPath中调用富文本高度计算的方法,这个我也在上一篇《tableview性能优化之coreText》文章中做了介绍。如果发现cell中文字没有显示或者没有显示全,可能是高度计算的那个方法计算出的高度有点偏小,适当给高度增加3~4就可以了。

你可能感兴趣的:(iOS 即时聊天界面优化心得)