iOS UITableView 优化

2017-05-04  本文已影响0人  莦婼姑娘

1、cellForRowAtIndexPath不要做耗时操作,尽量不要再这个方法里解压资源

2、读取文件,写入文件,最好是放到子线程,或先读取好,在让tableView去显示。

栗子🌰:cell多多少少都会带有一些图片,当你下滑时候是否发现有那么一点点的卡顿现成,特别是网络不好,那么在cell里面异步加载图片是个程序员都会想到,但是如果你给每个循环对象都加上异步加载,并且下滑的时候,这一操作将会被执行,虽然是异步,但是一个app里面的线程过多也会卡顿的,特别是在下滑操作的时候给每个图片进行异步加载。那么这里可以利用UIScrollViewDelegate代理很好的解决这问题,

- (void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate;

- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView;

可以识别tableview禁止或者减速滑动结束的时候进行异步加载图片,以下方法来执行异步加载操作:

//获取可见部分的对象

NSArray *visiblePaths = [self.tableView indexPathsForVisibleRows];

for (NSIndexPath *indexPath in visiblePaths){

//获取的dataSource里面的对象,并且判断加载完成的不需要再次异步加载

}

//同时在cell绘制中也做限制

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{

//如果tableview 停止滑动的时候开始异步加载图片

if (self.tableView.dragging == NO && self.tableView.decelerating == NO){

//开始异步加载图片

}

最后也别忘记在内存紧张的情况下释放调所有的异步线程,以保证的你的app不会被系统强制关闭,

- (void)didReceiveMemoryWarning{

//  释放调异步加载图片的线程以及所有图片资源对象

}

还有千万别忘记销毁的时候手动把所有的使用到的代理设置nil。

或者我们使用第三方 SDWebImage(异步操作) 下载图片。

3.尽量少得计算计算,最好是先计算好,cellForRowAtIndexPath只做显示

4.尽量不要去添加和移除view,现将会用到的控件懒加载,要就显示,不要就隐藏

6.tableView滚动的时候,不要去做动画(微信的聊天界面做的就很好,在滚动的时候,动态图就不让他动,滚动停止的时候才动,不然可能会有点影响流畅度)

7.cell里面的控件,约束最好不要使用remake,动态添加约束是比较耗性能的

8.cell里面的控件,背景最好是不透明的(图层混合靠GPU去渲染,会影响性能,绿色的好,红色的性能差), view的背景颜色clearColor尽量少

9.图片圆角不要使用layer.cornerRadius,因为通过图层去渲染的话都会影响性能

10.图层最好不要使用阴影,阴影会导致离屏渲染(在进入屏幕渲染之前,还看不到的时候会再渲染一次,尽量不要产生离屏渲染)

11.异步绘制

12.栅格化

13.借助工具来测试性能

14.AsyncDisplayKit ->不使用UIKit (UIView) ->  (Node)

一、视图上面的优化

1、使用不透明视图(alpha=1)。设置cell上所有视图的opaque = YES。不透明视图可以极大的提高视图的渲染速度。

2、减少视图的数目。使用自定义的view,而非预定义的view,明显会快些。顾名思义就是说,自定义cell后,cell里面的子视图也抽象封装。

二、视图方面的刷新

我们经常请求完数据后,讲数据传递给tableview后,我们需要调用表的reloadData 方法,调用这个方法后,会继续调用创建cell和高度的方法。这样的话,就有可能存在性能方面的问题,也有可能导致crash。要强调的是,如果我们只是局部刷新,那就采用局部刷新的方法,尽量不必要去调用reloadData。常见的场景就是例如,微信朋友圈,涉及到单条说说的评论,我们只需要刷新单个单元格或者单个组就能满足我们要求。

2.1、刷新单个cell

NSIndexPath*path = [NSIndexPathindexPathForRow:0inSection:0];[self.tableviewreloadRowsAtIndexPaths:[NSArrayarrayWithObjects:path,nil] withRowAnimation:UITableViewRowAnimationFade];

2.2、 刷新局部的section

[self.tableview reloadSections:[[NSIndexSet alloc]initWithIndex:0]withRowAnimation:UITableViewRowAnimationFade];

三、缓存视图高度

http://www.cnblogs.com/wengzilin/p/4288027.html 

无论是否需要创建一个新的cell,你需要缓存rows的高度,因为这是TableView所需要的信息。如果你的cell的高度是固定的,你不必担心。然而,如果它不是固定的,你需要确保你的cell计算足够的快。

一般的做法,选择在model增加一个成员变量,CGFloat类型,用这个成员变量去记住每个cell的高度。

cell的预设高度

四、不要用AutoLayout

。使用的子视图越多,AutoLayout的效率越低,这是事实。那么为什么AutoLayout相对低效呢。是因为它要根据底层“Cassowary”的约束求解系统进行约束计算,从而得到一个唯一解,这时AutoLayout才不会报警告或错误(相信拖控件的同学肯定遇到过各种黄色警告和红包约束冲突吧)。假如内部的子控件越多,它需要进行的线性或非线性计算量越大,需要求解的约束越多,CPU计算耗费大量时间从而导致超过了一个VSync周期。相反的,假如我们进行手动布局,都是非常简单的线性计算,CPU就不用浪费那么时间,CPU的压力不会很大。(虽然这么说,但是我还是会继续取用AtuoLayout!)

上一篇下一篇

猜你喜欢

热点阅读