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)-提高加载更多内容时的效率的更多相关文章

  1. PHP+Ajax点击加载更多内容 -这个效果好,速度快,只能点击更多加载,不能滚动自动加载

    这个效果好,速度快,只能点击更多加载,不能滚动自动加载 一.HTML部分 <div id="more"> <div class="single_item ...

  2. PHP+Ajax点击加载更多内容

    css样式: <style type="text/css"> #more{margin:10px auto;width: 560px; border: 1px soli ...

  3. jquery制作图片瀑布流点击按钮加载更多内容

    <script type="text/javascript" src="js/jquery-1.9.1.min.js"></script> ...

  4. Jquery鼠标滚动到页面底部自动加载更多内容,使用分页

    index.php代码   [html] view plaincopy <!DOCTYPE html PUBLIC ;}                .single_item{padding: ...

  5. 实现Android ListView 自动加载更多内容

    研究了几个小时终于实现了Android ListView 自动加载的效果. 说说我是怎样实现的.分享给大家. 1.给ListView增加一个FooterView,调用addFooterView(foo ...

  6. Jquery+php鼠标滚动到页面底部自动加载更多内容,使用分页

    1.index.php <style type="text/css"> #container{margin:10px auto;width: 660px; border ...

  7. [转]微信小程序之加载更多(分页加载)实例 —— 微信小程序实战系列(2)

    本文转自;http://blog.csdn.net/michael_ouyang/article/details/56846185 loadmore 加载更多(分页加载) 当用户打开一个页面时,假设后 ...

  8. 微信小程序之上拉加载更多

    loadmore 加载更多(分页加载) 当用户打开一个页面时,假设后台数据量庞大时,一次性地返回所有数据给客户端,页面的打开速度就会有所下降,而且用户只看上面的内容而不需要看后面的内容时,也浪费用户流 ...

  9. jQuery+php+Ajax文章列表点击加载更多功能

    jQuery+php+Ajax实现的一个简单实用的文章列表点击加载更多功能,点击加载更多按钮,文章列表加载更多数据,加载中有loading动画效果. js部分: <script type=&qu ...

随机推荐

  1. IPFS星际节点网站 IPNS域名解析教程

    IPNS星际文件系统IPFS提供的域名命名空间,相当于经典HTTP协议中的DNS.只不过是,IPNS是将内容寻址的哈希值(HASH值)转换为域名,而DNS是将IP地址转换为域名. 前段时间,IPFS协 ...

  2. Python学习札记(三) I/O

    参考:输入和输出 I/O 1.print()函数 a.调用print()输出字符串有以下两种方式:(1)print('[字符串]') (2)print("[字符串]") b.调用p ...

  3. gdb 调试coredump文件过程:

    第一步:首先需要一个进程的coredump文件,怎么搞出coredump文件呢? 1. ps -fax|grep                 进程名称 找到进程的pid 2.gdb -p pid ...

  4. LA 5713 秦始皇修路

    https://vjudge.net/problem/UVALive-5713 题意: 秦朝有n个城市,需要修建一些道路使得任意两个城市之间都可以连通.道士徐福声称他可以用法术修路,不花钱,也不用劳动 ...

  5. Codeforces Round #361 (Div. 2) E. Mike and Geometry Problem 离散化+逆元

    E. Mike and Geometry Problem time limit per test 3 seconds memory limit per test 256 megabytes input ...

  6. (转)SQL Server中的索引结构与疑惑

    说实话我从没有在实际项目中使用过索引,仅知道索引是一个相当重要的技术点,因此我也看了不少文章知道了索引的区别.分类.优缺点以及如何使用索引.但关于索引它最本质的是什么笔者一直没明白,本文是笔者带着这些 ...

  7. Chrome自动化搭建

    工具安装: 1.selenium-java-2.53.0-srcs.jar 2.selenium-java-2.53.0.jar 3.下载chromedriver.exe(下载地址:http://ch ...

  8. 为什么U盘在拔出之前需要“安全弹出”?

    前言 我们不知道从什么时候开始有一个观念:U盘一定要点击“安全弹出”才能拔.那么是不是在任何情况下都必须要这样呢? 介绍 U盘的传输策略有两种: 写入缓存:这种策略在windows中称为“更好的性能” ...

  9. RabbitMQ 如何保证消息不丢失?

    RabbitMQ一般情况很少丢失,但是不能排除意外,为了保证我们自己系统高可用,我们必须作出更好完善措施,保证系统的稳定性. 下面来介绍下,如何保证消息的绝对不丢失的问题,下面分享的绝对干货,都是在知 ...

  10. spring注入的四种方式

    配置文件spring.xml: <?xml version="1.0" encoding="UTF-8"?> <beans xmlns=&qu ...