iOS中的UITableView的重用机制与加载优化详解

2020-01-18 20:09:36刘景俊

数据对接:


/**
 * cell数据回调
 */
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {

  static NSString *identifier = @"identifier";
  // 自制cell组件
  AccountCell *cell = [[AccountCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:identifier];

  /** 多数据源分开对接:**/
  // 头像
  [cell.avatar setImage:[UIImage imageNamed:_url_datasource[indexPath.row]]];
  // 姓名
  cell.name.text = _name_datasource[indexPath.row];

  // 或者:

  /** 数据源合并后对接**/
  // 取出对应数据模型
  Model *model = _datasource[indexPath.row];
  // 头像
  [cell.avatar setImage:[UIImage imageNamed:model.url]];
  // 姓名
  cell.name.text = model.name;

  return cell;
}

如何对UITableView的滚动加载进行优化,防止卡顿?

UITableView的滚动优化主要在于以下两个方面:

减少cellForRowAtIndexPath代理中的计算量(cell的内容计算) 减少heightForRowAtIndexPath代理中的计算量(cell的高度计算)

uitableview重用机制,ios重用机制,ios,cell的重用机制

减少cellForRowAtIndexPath代理中的计算量

首先要提前计算每个cell中需要的一些基本数据,代理调用的时候直接取出; 图片要异步加载,加载完成后再根据cell内部UIImageView的引用设置图片; 图片数量多时,图片的尺寸要跟据需要提前经过transform矩阵变换压缩好(直接设置图片的contentMode让其自行压缩仍然会影响滚动效率),必要的时候要准备好预览图和高清图,需要时再加载高清图。 图片的‘懒加载'方法,即延迟加载,当滚动速度很快时避免频繁请求服务器数据。 尽量手动Drawing视图提升流畅性,而不是直接子类化UITableViewCell,然后覆盖drawRect方法,因为cell中不是只有一个contentview。绘制cell不建议使用UIView,建议使用CALayer。原因要参考UIView和CALayer的区别和联系。

减少heightForRowAtIndexPath代理中的计算量

由于每次TableView进行update更新都会对每一个cell调用heightForRowAtIndexPath代理取得最新的height,会大大增加计算时间。如果表格的所有cell高度都是固定的,那么去掉heightForRowAtIndexPath代理,直接设置TableView的rowHeight属性为固定的高度; 如果高度不固定,应尽量将cell的高度数据计算好并储存起来,代理调用的时候直接取,即将height的计算时间复杂度降到O(1)。例如:在异步请求服务器数据时,提前将cell高度计算好并作为dataSource的一个数据存到数据库供随时取用。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持ASPKU。