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 的值来控制子线程数据.
在不需要处理用户交互时,可以适当增加子线程数据,者可以通过在代理方法中进行设置:
6)自动加载更新数据的优化
//还有一点要注意的就是当图片下载完成后,如果cell是可见的,还需要更新图像:
// 也可不遍历,直接与头尾相比较,看是否在中间即可。
想看详细的代码,可以到下面地址下载小Demo:https://github.com/moon13sun/UITextViewDemo
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
相关文章推荐
- 峰回路转,Firefox 浏览器即将重返 iOS 平台
- 深入理解PHP7内核之FAST_ZPP
- 峰回路转,Firefox 浏览器即将重返 iOS 平台
- 个人信息安全报告发布:有 APP 每分钟调用位置权限 1468 次
- 不可修补的 iOS 漏洞可能导致 iPhone 4s 到 iPhone X 永久越狱
- 下载量超过一亿的流行应用被发现含有恶意模块
- iOS 12.4 系统遭黑客破解,漏洞危及数百万用户
- 每日安全资讯:NSO,一家专业入侵 iPhone 的神秘公司
- [转][源代码]Comex公布JailbreakMe 3.0源代码
- 苹果与Siri的七年之痒:“宫斗”戏码不断上演
- Flex 性能优化常用手法总结
- oracle 性能优化建议小结
- Lua性能优化技巧(一):前言
- Lua性能优化技巧(五):削减、重用和回收
- Lua性能优化技巧(三):关于表
- Lua性能优化技巧(四):关于字符串
- SQL Server 2016 查询存储性能优化小结
- MySQL性能优化 出题业务SQL优化
- PowerShell脚本性能优化技巧总结