UITableView优化

  • UITableView优化的首要任务是要优化cellForRowAtIndexPath和heightForRowAtIndexPath方法
// 决定cell长啥样。也就是绘制cell
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    ContacterTableCell *cell = [tableView dequeueReusableCellWithIdentifier:@"ContacterTableCell"];
    if (!cell) {
        cell = (ContacterTableCell *)[[[NSBundle mainBundle] loadNibNamed:@"ContacterTableCell" owner:self options:nil] lastObject];
    }
    NSDictionary *dict = self.dataList[indexPath.row];
    [cell setContentInfo:dict];
    return cell;
}
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {
    UITableViewCell *cell = [tableView cellForRowAtIndexPath:indexPath];
    return cell.frame.size.height;
}

影响UITableView滚动性能的因素


cellForRowAtIndexPath方法中处理了过多业务
tableviewCell的subview层级太复杂,做了大量透明处理
cell的height动态变化时计算方式不对


UITableView的优化主要从三个方面入手


  • 主要方面:
  • 1.提前计算并缓存好高度(布局),计算完了高度写进数据库,因为heightForRowAtIndexPath:是调用最频繁的方法;
  • 2.异步绘制,遇到复杂界面,遇到性能瓶颈时,可能就是突破口;不要阻塞主线程,否则在更新数据时,整个界面卡住不动,完全不响应用户请求。出现这种现象的原因就是主线程执行了耗时很长的函数或方法,在其执行完毕前,无法绘制屏幕和响应用户请求。其中最常见的就是网络请求了,它通常都需要花费数秒的时间,而你不应该让用户等待那么久。解决办法就是使用多线程,让子线程去执行这些函数或方法
  • 3.滑动时按需加载,这个在大量图片展示,网络加载的时候很管用!(SDWebImage已经实现异步加载,配合这条性能杠杠的)
  • 如果前3步人不能解决滚动TableView卡顿,可以利用drawRect:手动绘制视图/
    在使用高性能的Cell时,还是推荐使用代码来创建单元格类。当 UITableViewCell拥有多个子视图时,IOS的渲染机制会拖慢速度。重写drawRect直接绘制内容的方式可 以提高性能,而不是在类初始化的时候初始化一些label或者imageview等。
  • 次要方面:
    • 4.尽量少用或不用透明图层
    • 5.如果Cell内现实的内容来自web,使用异步加载,缓存请求结果
    • 6.尽量使所有的view opaque,包括Cell自身
    • 7.正确使用reuseIdentifier来重用Cells

UITableView注意点


前言:数据源就是有真真正正的数据的意思。所谓数据源方法,就是在这个方法里面实现对真真正恒的数据进行具体操作
  • 1.有关TableView的效果一定要跑真机!因为Mac上的虚拟机 的性能完爆 iPhone,所有不要说我的应用在模拟器上调试时不卡啊!模拟器只能模拟 iOS 软件的运行环境,不能模拟硬件性能!
  • 2.性能优化:使用Instruments三件套(Time Profiler,Core Animation,GPU Driver)
  • 3.UITableView是UIScrollView的子类,因此它可以自动响应滚动事件(一般为上下滚动)。
    它内部包含0到多个UITableViewCell对象,每个tablecell展示各自的内容。当新cell需要被显示时,就会调用tableView:cellForRowAtIndexPath:方法来获取或创建一个cell;而不可视时,它又会被释放。由此可见,同一时间其实只需要存在一屏幕的cell对象即可,不需要为每一行创建一个cell.
    此外,UITableView还可以分为多个sections,每个区段都可以有自己的head、foot和cells。而在定位一个cell时,就需要2个字段了:在哪个section,以及在这个section的第几行。
    因为UITableView只需要一屏幕的UITableViewCell即可。因此在当cell不可见时,可以将其缓存起来,而在需要时继续使用它即可。而UITableView也提供了这种机制,只需要简单地设置一个identifier即可。
  • 4.大部分的多线程操作都不需要用到 NSThread 和 runloop了,现在用的是GCD,NSOperationQueue
  • 5.图片异步加载无非就是在tableView:cellForRowAtIndexPath:方法里发起异步请求,图片加载完后根据 UIImageView 的引用设置图片,并使用懒加载的方式减少快速滑动时因为网络请求过于频繁与切换线程显示图片造成的卡顿。从网络搂回来图片后,先根据需要显示的图片大小切成合适大小的图(十字相乘得到等比例小图片),每次只显示处理过大小的图片,当查看大图时在显示大图。如果服务器能直接返回预处理好的小图和图片的大小更好

你可能感兴趣的:(UITableView优化)