博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
iOS性能优化-TableView
阅读量:4047 次
发布时间:2019-05-24

本文共 2105 字,大约阅读时间需要 7 分钟。

TableView 性能优化非常重要,一款号的APP决不能出现界面滚动时出现影响客户体验的卡顿效果.

UITableView 只要针对性做好优化,卡顿效果是可以改善或者消除的.

首先介绍一下 cell 的加载原理:
UITableView 继承自 UIScrollView ,可以相应滚动时间,当有内容需要展示时,新的 cell 会被创建,会调用 tableView:cellForRowAtIndexPath: 方法来创建或者从缓存池中获取一个 cell ;当 cell 被滚动出屏幕范围,cell就会被释放(或者放入缓存池).
因此,当界面出现时,只需要加载屏幕能显示的cell即可,而不需要一次性加载所有内容的 cell. 这样可以是 APP 界面加载更加的流畅.当然这些优化并不需要我们来管理.

下面介绍一些我们可以自己设置的新能优化!

1)尽量不透明的视图
不透明视图可以极大提高渲染的速度.因此如果可以,将 cell 及其子视图的 opaque 属性设置为 YES(默认值);

cell 的 backgroundColor 的 apha 值应为1(不要使用 clearColor),图像的 apha 值也应该为 1.

2)cell 重用机制

当 cell 不使用时,将其放入缓存池,这样不用频繁地创建 cell.
**注意: cell 被重用时,它内部的内容并不会被自动清楚,可以手动调用 setNeedSDisplayInRect: 或者 setNeedsDisplay 方法.

3.在添加 cell 的时候,如果不需要动画效果,不要使用 tableView insertRowsAtIndexPaths: withRowAnimation: 方法,直接调用 reloadData 方法.

原因:前者会对所有的 indexPaths执行,即使 cell 不需要显示.这就可能同时创造大量并不需要的 cell(在模拟器上测试)

4.如果 cell 中图片较多,使用自定义 cell 好些,最佳解决方法是在自定义 cell 中,实现 - drawRect: 方法,绘制图片 . 同时设置 cell 的选中样式 为 UITableViewCellSelectionStyleNone

5.更新数据,不要阻塞主线程

尤其是访问网络数据,不要在主线程执行,而是在子线程执行数据的获取更新等操作.
**注意: 子线程数量太多会影响主线程性能,因此 可以通过设置 NSoperationQueue 对象的 maxConcurrentOperationCount 的值来控制子线程数据.

在不需要处理用户交互时,可以适当增加子线程数据,者可以通过在代理方法中进行设置:

- (void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate{    if (!decelerate) {        queue.maxConcurrentOperationCount = 5;    }}- (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView{    queue.maxConcurrentOperationCount = 2;}

6)自动加载更新数据的优化

- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath {        if (count - indexPath.row < 10 && !updating) {            // update方法获取到结果后,设置updating为NO            updating = YES; [self update];        }}

//还有一点要注意的就是当图片下载完成后,如果cell是可见的,还需要更新图像:

// 也可不遍历,直接与头尾相比较,看是否在中间即可。

NSArray *indexPaths = [self.tableView indexPathsForVisibleRows];for (NSIndexPath *visibleIndexPath in indexPaths) {    if (indexPath == visibleIndexPath) {       MyTableViewCell *cell = (MyTableViewCell *) [self.tableView cellForRowAtIndexPath:indexPath];   [cell setNeedsDisplayInRect:imageRect];    break;     }}

想看详细的代码,可以到下面地址下载小Demo:

转载地址:http://cfwci.baihongyu.com/

你可能感兴趣的文章
ubuntu下SVN服务器安装配置
查看>>
MPMoviePlayerViewController和MPMoviePlayerController的使用
查看>>
CocoaPods实践之制作篇
查看>>
[Mac]Mac 操作系统 常见技巧
查看>>
苹果Swift编程语言入门教程【中文版】
查看>>
捕鱼忍者(ninja fishing)之游戏指南+游戏攻略+游戏体验
查看>>
iphone开发基础之objective-c学习
查看>>
iphone开发之SDK研究(待续)
查看>>
计算机网络复习要点
查看>>
Variable property attributes or Modifiers in iOS
查看>>
NSNotificationCenter 用法总结
查看>>
C primer plus 基础总结(一)
查看>>
剑指offer算法题分析与整理(三)
查看>>
Ubuntu 13.10使用fcitx输入法
查看>>
pidgin-lwqq 安装
查看>>
mint/ubuntu安装搜狗输入法
查看>>
C++动态申请数组和参数传递问题
查看>>
opencv学习——在MFC中读取和显示图像
查看>>
Matlab与CUDA C的混合编程配置出现的问题及解决方案
查看>>
如何将PaperDownloader下载的文献存放到任意位置
查看>>