美文网首页
iOS UITableView 优化

iOS UITableView 优化

作者: 莦婼姑娘 | 来源:发表于2017-05-04 15:02 被阅读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!)

    相关文章

      网友评论

          本文标题:iOS UITableView 优化

          本文链接:https://www.haomeiwen.com/subject/ezzrtxtx.html