UITableView的性能优化?滑动的时候有卡顿的感觉是为什么?怎么能够解决这个问题?

4 篇文章 0 订阅
1 篇文章 0 订阅

在使用第三方应用时,却经常遇到性能上的问题,普遍表现在滚动时比较卡,特别是cell中包含图片的情况时。
实际上针对性地优化一下就可以解决tableView滑动的时候卡顿的问题:
1、使用不透明视图。不透明的视图可以提高渲染的速度。可以将cell及其子视图的opaque属性设为YES(默认值)。
2、不要重复创建不必要的cell。UITableView只需要一屏幕的UITableViewCell对象即可。因此在 cell 不可见时,可以将其缓存起来,而在需要时继续使用它即可。注意:cell被重用时,需要调用 setNeedsDisplayInRect: 或 setNeedsDisplay方法重绘 cell。
3、减少动画效果的使用,最好不使用 insertRowsAtIndexPaths:withRowAnimation:方法,而是直接调用 reloadData方法。
4、减少视图的数目。Cell包含了textLabel、detailTextLabel 和 imageView等view,而你还可以自定义一些视图放在它的 contentView 里,创建它会消耗较多资源,并且也影响渲染的性能。
5、cell 包含图片,且数目较多,使用自定义的 cell 速度会比使用默认的要快。继承UITableViewCell ,重写 drawRect 方法:-(void)drawRect:(CGRect)rect{ if (image) { [image drawAtPoint:imagePoint]; self.image = nil; } else { [placeHolder drawAtPoint:imagePoint];} [text drawInRect withFont:font lineBreakMode:UILineBreakModeTailTruncation]; }
不过这样一来,你会发现选中一行后,这个cell 就变蓝了其中的内容就被挡住了。最简单的方法就是将 cell 的 selectionStyle属性设为 UITableViewCellSelectionStyleNone,这样就不会被高亮了。
、不需要与用户交互时,使用CALayer,将内容绘制到layer 上,然后对 cell 的contentView.layer 调用 addSublayer: 方法。这个例子中,layer 并不会显著影响性能,但如果 layer 透明,或者有圆角、变形等效果,就会影响到绘制速度了。解决办法可参见后面的预渲染图像。
6、不要做多余的绘制工作。在实现drawRect:的时候,它的 rect参数就是需要绘制的区域,这个区域之外的不需要进行绘制。
7、预渲染图像。你会发现即使做到了上述几点,当新的图像出现时,仍然会有短暂的停顿现象。解决的办法不是在图形上下文中画,导出成 UIImage对象,然后再绘制到屏幕。(头像圆角,或者其他变形的时候,用图形上下文能提高性能。)异步绘制。
8、不要阴塞主线程。tableView在更新数据时,整个界面卡住不动,完全不响应用户请求。常见的是网络请求,等待时间长待数秒。
9、解决方案:使用多线程,让子线程去执行这些函数或方法。
10、注意:当下载线程数超过 2 时,会显著影响主线程的性能。所以在不需要响应用户请求时,下载线程数可以增加到 5 ,不建议再加了,以加快下载速度。如果用户正在交互,应把线程数量控制在 2 个以内。
11、提前计算并缓存好高度,因为 heightforrowatindexpath 调用非常频繁。
12、选择正确的数据结构:学会选择对业务场景最合适的数组结构是写出高效代码的基础。比如,数组:有序的一组值。使用索引来查询很快,使用值查询很慢,插入/删除很慢。字典:存储键值对,用键来查找比较快。集合:无序的一组值,用值来查找很快,插入/删除很快。
13、gzip/zip压缩:当从服务端下载相关附件时,可以通过 gzip/zip压缩后再下载,使得内存更小,下载速度也更快。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值