UITableView优化方案
1、UITableView的简单认识
> UITableView最核心的思想就是UITableViewCell的重用机制。简单的理解就是:UITableView只会创建一屏幕(或一屏幕多一点)的UITableViewCell,其他都是从中取出来重用的。
> 知道UITableViewCell的重用原理后,我们来看看UITableView的回调方法。UITableView最主要的两个回调方法是tableView:cellForRowAtIndexPath:和tableView:heightForRowAtIndexPath:。理想上我们是会认为UITableView会先调用前者,再调用后者,因为这和我们创建控件的思路是一样的,先创建它,再设置它的布局。但实际上却并非如此,我们都知道,UITableView是继承自UIScrollView的,需要先确定它的contentSize及每个Cell的位置,然后才会把重用的Cell放置到对应的位置。所以事实上,UITableView的回调顺序是先多次调用tableView:heightForRowAtIndexPath:以确定contentSize及Cell的位置,然后才会调用tableView:cellForRowAtIndexPath:,从而来显示在当前屏幕的Cell。
> 看到这里,想必大伙也都能隐约察觉到,UITableView优化的首要任务是要优化上面两个回调方法。
2、优化思路
> 计算和布局分离,并缓存到数据源中
model.cellHeight = [self calculateCellHeightWith:dict[@"article"]];
> 即将停止滑动和停止滑动后开始图片的下载(模仿官方demo)
- (void)loadImagesForOnscreenRows
{
if (self.entries.count > )
{
NSArray *visiblePaths = [self.tableView indexPathsForVisibleRows];
for (NSIndexPath *indexPath in visiblePaths)
{
AppRecord *appRecord = (self.entries)[indexPath.row]; if (!appRecord.appIcon)
// Avoid the app icon download if the app already has an icon
{
[self startIconDownload:appRecord forIndexPath:indexPath];
}
}
}
}
> 在Cell上添加系统控件的时候,实质上系统都需要调用底层的接口进行绘制,当我们大量添加控件时,对资源的开销也会很大,所以我们可以索性直接异步绘制,提高效率
关于绘制,有两种思路来实现,一种是在Cell上添加一个UIView,调用setNeedsDisplay方法,另一种在Cell上添加UIImageView,使用UIGraphicsBeginImageContextWithOptions将绘制的内容以图片的形式返回,设置为UIImageView的图片;
> 尽量使用代码创建Cell,而不是xib
xib需要系统自动转码,肯定会增加一层负担
> 其他方面
1、使用不透明的视图。
2、正确使用重用的机制
3、减少视图的数量
4、尽量动态地创建视图,而是使用hidden属性控制视图的显示与否
最新文章
- 文件随机读写专用类——RandomAccessFile
- django TEMPLATES
- SSH服务器与Android通信(3)--Android客户端发送数据
- python处理经过gzip压缩的网页内容
- JS图表组件 highcharts 简单的介绍
- C# tostring()汇总
- tensorflow Sigmoid 应用
- c#创建access数据库和数据表
- ThreadLocal 原理和使用场景分析
- slitaz的root密码
- js04-DOM对象一
- Latex自定义文档纸张大小
- JAVA导入表格功能总结
- [Oracle][DataGuard]Standby数据库文件有损坏时的处理方法
- java中Date与DateFormat的格式输出
- 3.SLB 回话保持功能分析
- Win10系统80端口被系统进程占用
- HDU 4576 Robot (概率 &; 期望)
- hexo静态博客的安装及应用实践记录
- python3.6 利用requests和正则表达式爬取猫眼电影TOP100