iOS性能优化-TableView

来源:互联网 发布:中央人民大学网络教育 编辑:程序博客网 时间:2024/05/16 15:40

TableView 性能优化非常重要,一款号的APP决不能出现界面滚动时出现影响客户体验的卡顿效果.

UITableView 只要针对性做好优化,卡顿效果是可以改善或者消除的.
首先介绍一下 cell 的加载原理:
UITableView 继承自 UIScrollView ,可以相应滚动时间,当有内容需要展示时,新的 cell 会被创建,会调用 tableView:cellForRowAtIndexPath: 方法来创建或者从缓存池中获取一个 cell ;当 cell 被滚动出屏幕范围,cell就会被释放(或者放入缓存池).
因此,当界面出现时,只需要加载屏幕能显示的cell即可,而不需要一次性加载所有内容的 cell. 这样可以是 APP 界面加载更加的流畅.当然这些优化并不需要我们来管理.

下面介绍一些我们可以自己设置的新能优化!
1)尽量不透明的视图
不透明视图可以极大提高渲染的速度.因此如果可以,将 cell 及其子视图的 opaque 属性设置为 YES(默认值);

cell 的 backgroundColor 的 apha 值应为1(不要使用 clearColor),图像的 apha 值也应该为 1.

2)cell 重用机制
当 cell 不使用时,将其放入缓存池,这样不用频繁地创建 cell.
**注意: cell 被重用时,它内部的内容并不会被自动清楚,可以手动调用 setNeedSDisplayInRect: 或者 setNeedsDisplay 方法.

3.在添加 cell 的时候,如果不需要动画效果,不要使用 tableView insertRowsAtIndexPaths: withRowAnimation: 方法,直接调用 reloadData 方法.
原因:前者会对所有的 indexPaths执行,即使 cell 不需要显示.这就可能同时创造大量并不需要的 cell(在模拟器上测试)

4.如果 cell 中图片较多,使用自定义 cell 好些,最佳解决方法是在自定义 cell 中,实现 - drawRect: 方法,绘制图片 . 同时设置 cell 的选中样式 为 UITableViewCellSelectionStyleNone

5.更新数据,不要阻塞主线程
尤其是访问网络数据,不要在主线程执行,而是在子线程执行数据的获取更新等操作.
**注意: 子线程数量太多会影响主线程性能,因此 可以通过设置 NSoperationQueue 对象的 maxConcurrentOperationCount 的值来控制子线程数据.

在不需要处理用户交互时,可以适当增加子线程数据,者可以通过在代理方法中进行设置:

- (void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate{    if (!decelerate) {        queue.maxConcurrentOperationCount = 5;    }}- (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView{    queue.maxConcurrentOperationCount = 2;}

6)自动加载更新数据的优化

- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath {        if (count - indexPath.row < 10 && !updating) {            // update方法获取到结果后,设置updating为NO            updating = YES; [self update];        }}

//还有一点要注意的就是当图片下载完成后,如果cell是可见的,还需要更新图像:
// 也可不遍历,直接与头尾相比较,看是否在中间即可。

NSArray *indexPaths = [self.tableView indexPathsForVisibleRows];for (NSIndexPath *visibleIndexPath in indexPaths) {    if (indexPath == visibleIndexPath) {       MyTableViewCell *cell = (MyTableViewCell *) [self.tableView cellForRowAtIndexPath:indexPath];   [cell setNeedsDisplayInRect:imageRect];    break;     }}

想看详细的代码,可以到下面地址下载小Demo:https://github.com/moon13sun/UITextViewDemo

0 0
原创粉丝点击