UITableView 性能优化
UITableView是我们开发过程中最常用的UI之一,因此掌握UITableView的优化方法,在我们开发的过程中能事半功倍。长话段数,直接进入优化的方法之中。
主要分为以下几点:
1只定义一种Cell。
2提前计算并缓存每个Cell的高度。
3提前创建真正显示的、需要加工的数据并缓存。
4缓存View!
其它(使用不透明的图片,减少子视图的添加,不要阻塞主线程,避免使用图形特效)
1、只定义一种cell
对于需要展示大量数据的UI控件UITableView ,一般我们都会采用自定义的UITableviewcell的方式进行数据的展示。每个cell所展示的数据不一致,但是展示的样式都大同小异。如下图:
其cell的组成方式无非下图各个子控件组成的。可以通过View的hidden = YES和hidden = NO来进行控制。
2、提前缓存cell的高度
首先要确定的是,在iOS中,系统会先调用“tableView:heightForRowAtIndexPath:”获取每个Cell即将显示的高度,从而确定整个UITableView的布局。然后才调用“tableView:cellForRowAtIndexPath”获取每个Cell,我们也是在这里填充、设置Cell的。
所以,既然高度总会被用到,那就早早的在获取数据时就计算好吧!
在Model(Entity)中计算并保存Cell的高度
其实,在Model(Entity)中保存UI的参数是很奇怪的=。=(最好放在ViewModel中,就是MVVM模式的),我们的Entity可能就是下面的样子:
@interfaceDataEntity :NSObject//原始数据
@property(copy,nonatomic)NSString *content;
@property(copy,nonatomic)NSString *title;//Cell 高度
@property(assign,nonatomic)CGFloat cellHeight;
//计算高度
- (void)calculateCellHeight;@end
这样,就不用在“tableView:heightForRowAtIndexPath:”中每次都计算了。
3、提前创建真正显示的、需要加工的数据并缓存
Cell中显示的内容,很多时候可能并不是直接从服务器拿到的数据,而是经过“加工”的数据。如本文中的“动态”也,每个Cell的标题、正文都有可点击的连接Link、表情图片等富文本内容,而我们一般用NSAttributeString类来显示。
既然每次都会用到,倒不如在获取到数据的时候就创建、加工好这些内容,等到需要现实的时候,直接拿来用不就行了。
所以,我们的Entity类可能变成下面这个样子:
@interfaceDataEntity :NSObject
//原始数据
@property(copy,nonatomic)NSString *content;
@property(copy,nonatomic)NSString *title;
//Cell 高度
@property(assign,nonatomic)CGFloat cellHeight;
//真正显示的内容
@property(strong,nonatomic)NSAttributedString *showTitle;
@property(strong,nonatomic)NSAttributedString *showContent;
//计算高度
- (void)calculateCellHeight;
//创建、加工真正显示的内容
- (void)setupShowTitileAndContent;
@end
这样,在“tableView:cellForRowAtIndexPath”中,我们直接拿showTitle、showContent来显示就好,不用再创建。