您的位置:首页 > 移动开发 > IOS开发

iOS性能优化-TableView

2016-07-10 11:25 423 查看
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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  ios 性能优化 app