UITableview优化随笔(1)-提高加载更多内容时的效率
UITableView上拉加载更多的功能相信很多应用都会用到,类似朋友圈、微博这样的应用,tableView中的数据内容高度根据内容来变化,同时需要加载大量的数据(上拉加载更多),要怎样才能保证加载数据时的页面流畅呢?
UITableView的原理和使用,以及其滚动帧率的优化,不是本篇blog要讨论的问题,这个在网上能搜到大量资料,这里不再赘述。
一般在实现上拉加载更多数据的实现思路是:
1.获取新的数据
2.在当前dataArray中添加这些数据
3.在tableView上显示这些数据
其中第三步,可以通过insertRowsAtIndexPaths::或者reloadData这两种方式实现。
这里讨论使用reloadData的这种情况:
我们知道UITableView在滚动时会不断地调用
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath;
- (UITableViewCell *)cellForRowAtIndexPath:(NSIndexPath *)indexPath;
这两个方法,因此,要保证列表滚动的流畅性,最重要的就是优化这两个方法中的代码,保证代码的执行时间短。
而在加载更多数据时,在主动执行reloadData方法后,系统会重新计算一次所有cell的高度,也就是会根据cell数量在调用N次heightForRowAtIndexPath方法,当tableView中的数据较少,还可以接受,而当页面上数据加载较多时,即使heightForRowAtIndexPath方法执行效率再高,也无法避免出现UI卡顿的情况。
那么怎么办呢?
很简单,我们可以把cell的高度缓存下来在需要使用的时候取出,下面是实现的思路:
首先定义存储cell高度的模型,我们这里使用NSMutableDictionary,为什么不用NSMutableArray来做呢?稍后再说这个问题
NSMutableDictionary* _cellHeightDictionary;
接着在heightForRowAtIndexPath中:
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{ CGFloat cellHeight;
NSNumber* cellHeightNumber = [_cellHeightDictionary objectForKey:@(indexPath.row)];
if (cellHeightNumber) {//判断是否缓存了该cell的高度
cellHeight = [cellHeightNumber floatValue];
}else
{
cellHeight = [CustemCell cellHeightWithModel:_modelArray[indexPath.row]];//通过类方法获取cell高度
[_cellHeightDictionary setObject:@(cellHeight) forKey:@(indexPath.row)];//以indexPath为key存储cell高度
}
return cellHeight;
}
最后别忘了在重新刷新数据的时候清空cell高度的缓存。
这样修改完之后,不论页面加载了多少数据,每个cell的高度只需要计算一次,优化的目的也就达到了。
最后说一下为什么用NSMutableDictionary而不用NSMutableArray来存储cell height:
因为系统在调用heightForRowAtIndexPath是无序的,如果用数组来存数height,会导致高度错位和其他莫名其妙的问题,所以这里一定不能用数组来缓存高度。
UITableview优化随笔(1)-提高加载更多内容时的效率的更多相关文章
- PHP+Ajax点击加载更多内容 -这个效果好,速度快,只能点击更多加载,不能滚动自动加载
这个效果好,速度快,只能点击更多加载,不能滚动自动加载 一.HTML部分 <div id="more"> <div class="single_item ...
- PHP+Ajax点击加载更多内容
css样式: <style type="text/css"> #more{margin:10px auto;width: 560px; border: 1px soli ...
- jquery制作图片瀑布流点击按钮加载更多内容
<script type="text/javascript" src="js/jquery-1.9.1.min.js"></script> ...
- Jquery鼠标滚动到页面底部自动加载更多内容,使用分页
index.php代码 [html] view plaincopy <!DOCTYPE html PUBLIC ;} .single_item{padding: ...
- 实现Android ListView 自动加载更多内容
研究了几个小时终于实现了Android ListView 自动加载的效果. 说说我是怎样实现的.分享给大家. 1.给ListView增加一个FooterView,调用addFooterView(foo ...
- Jquery+php鼠标滚动到页面底部自动加载更多内容,使用分页
1.index.php <style type="text/css"> #container{margin:10px auto;width: 660px; border ...
- [转]微信小程序之加载更多(分页加载)实例 —— 微信小程序实战系列(2)
本文转自;http://blog.csdn.net/michael_ouyang/article/details/56846185 loadmore 加载更多(分页加载) 当用户打开一个页面时,假设后 ...
- 微信小程序之上拉加载更多
loadmore 加载更多(分页加载) 当用户打开一个页面时,假设后台数据量庞大时,一次性地返回所有数据给客户端,页面的打开速度就会有所下降,而且用户只看上面的内容而不需要看后面的内容时,也浪费用户流 ...
- jQuery+php+Ajax文章列表点击加载更多功能
jQuery+php+Ajax实现的一个简单实用的文章列表点击加载更多功能,点击加载更多按钮,文章列表加载更多数据,加载中有loading动画效果. js部分: <script type=&qu ...
随机推荐
- spark SQL学习(spark连接hive)
spark 读取hive中的数据 scala> import org.apache.spark.sql.hive.HiveContext import org.apache.spark.sql. ...
- mysql悲观锁以及乐观锁总结和实践
悲观锁介绍(百科): 悲观锁,正如其名,它指的是对数据被外界(包括本系统当前的其他事务,以及来自外部系统的事务处理)修改持保守态度,因此,在整个数据处理过程中, 将数据处于锁定状态.悲观锁的实现,往往 ...
- Struts2框架学习第二章——Struts2下的HelloWorld
本章要点 — Struts 2的下载和安装 — 纯手工创建一个Web应用 — 纯手工创建一个Struts 2应用 — 实现Struts 2的Action — 配置Struts 2的Action — ...
- Learning R笔记(一)
基本操作 帮助文档:?函数.演示:demo(函数).参数列表:formals(函数),返回为成对列表pairlist. 用all.equal函数检查浮点数是否相等,容忍度默认为1.5e-8,如果相等返 ...
- 在.net中运用HTMLParser解析网页的原理和方法
本文介绍了.net 版的一个HTMLParser网页解析开源类库(Winista.HTMLParser)的功能特性.工作原理和使用方法.对于使用.net进行Web信息提取的开发人员进行了一次HTMLP ...
- Python批量修改图片格式和尺寸
Python批量修改图片格式和尺寸 备注: 1.导入了PIL库,是处理图片用的,很强大; 2.导入了的win32库,是判断隐藏文件用的,我们的项目需要删除隐藏文件,不需要的可以直接找到删除. 3.导入 ...
- Ansible 小手册系列 十一(变量)
变量名约束 变量名称应为字母,数字和下划线. 变量应始终以字母开头. 变量名不应与python属性和方法名冲突. 变量使用 通过命令行传递变量(extra vars) ansible-playbook ...
- new/delete工作机制
body, table{font-family: 微软雅黑; font-size: 10pt} table{border-collapse: collapse; border: solid gray; ...
- 《APUE》第7章 进程环境-读书笔记
一.main函数. main函数的原型如下.argc是命令行参数的数目,argv是指向参数的各个指针所构成的数组. int main(int argc, char *argv[]) 当内核执行C程序时 ...
- redis的Hash类型以及其操作
hashes类型 hashes类型及操作Redis hash是一个string类型的field和value的映射表.它的添加.删除操作都是0(1)(平均).hash特别适合用于存储对象.相较于将对象的 ...