UITableView优化方案

时间:2023-03-09 19:10:51
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属性控制视图的显示与否