关于UITableView的性能优化(历上最全面的优化分析)

 (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath

这个代理方法的实现,在可见的页面是会重复绘制页面的,所以绝大部分人都会在这里做一些代码处理
比如:
static NSString *CellIdentifier = @"LazyTableCell";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];

很常规的,防止cell对象无限的被创建,等同于android里面适配器的方法
public View getView(int position, View convertView, ViewGroup arg2) 

以上举例代码是可以让cell被重复使用,一般大概只会在可见页面部分的几个cell会被new下,其他的全部重复使用前面已经有的cell对象,到时候只要填充数据就可以了

啰嗦下,android里面也是类似的处理的,给view添加tag值,到时候利用tag获取view对象

那么仅仅只是如此,恐怕现在的cell自定义的页面不只是文本那么简单,多多少少都会带有一些图片吧,当你下滑时候是否发现有那么一点点的卡顿现成,特别是网络不好,而且还是在iPhone4上跑的就会更明显了

那么在cell里面异步加载图片是个程序员都会想到,但是如果你给每个循环对象都加上异步加载,并且下滑的时候,这一操作将会被执行,虽然是异步,但是一个app里面的线程过多也会卡顿的,特别是在下滑操作的时候给每个图片进行异步加载

那么这里可以利用UIScrollViewDelegate代理很好的解决这问题
- (void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate
- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView
可以识别tableview禁止或者减速滑动结束的时候进行异步加载图片

以下方法来执行异步加载操作
      //获取可见部分的对象
       NSArray *visiblePaths = [self.tableView indexPathsForVisibleRows];
        for (NSIndexPath *indexPath in visiblePaths)
        {
           //获取的dataSource里面的对象,并且判断加载完成的不需要再次异步加载
             <code>
        }

同时在cell绘制中也做限制
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath

         if (self.tableView.dragging == NO && self.tableView.decelerating == NO)
            {
               //开始异步加载图片
                <code>
            }

如果tableview 停止滑动的时候开始异步加载图片

最后也别忘记在内存紧张的情况下释放调所有的异步线程,以保证的你的app不会被系统强制关闭
- (void)didReceiveMemoryWarning{
//  释放调异步加载图片的线程以及所有图片资源对象
<code>
}
还有千万别忘记销毁的时候手动把所有的使用到的代理设置nil
至此性能优化结束,来源于官方文案
时间: 2024-10-15 02:21:42

关于UITableView的性能优化(历上最全面的优化分析)的相关文章

【UIKit】UITableView.05 性能优化

UITableView.05 性能优化: [为何要性能优化]:TableView拖屏过程中,不断有对象"消失"在屏幕上,但是这样的对象还是存在的,当拖拉过多后,导致内存严重泄漏. 解决方法:仅提供有限的对象,拖拉过程中,只是将内存地址存放的内容进行改变. [旧代码] -(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { UITable

UITableView滚动性能优化

影响 UITableView 滚动的流畅性的原因 1.在代理方法中做了过多的计算占用了 UI 线程的时间 2.Cell里的图片吃GPU(在tableView:cellForRowAtIndexPath:中) 3.Cell 中 view 的组织复杂 关于第一点,首先要明白 tableview 的代理(这里指 datasource 和 delegate 的那套方法,下同)方法的调用顺序,和时机.对于一般的应用会有如下顺序: 1.向代理要 number Of Rows. 2.对于每行向代理要 heig

优化UITableView滚动性能

自定义的cell如下: 第一个:Instruments测试,iphone4 38fps-45fps,iphone3G 25fps // table with normal XIB based cells - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { static NSString *CellIdentifier = @"CustomC

Android 性能优化之内存泄漏检测以及内存优化(上)

在 Java 中,内存的分配是由程序完成的,而内存的释放则是由 Garbage Collecation(GC) 完成的,Java/Android 程序员不用像 C/C++ 程序员一样手动调用相关函数来管理内存的分配和释放,虽然方便了很多,但是这也就造成了内存泄漏的可能性,所以记录一下针对 Android 应用的内存泄漏的检测,处理和优化的相关内容,上篇主要会分析 Java/Android 的内存分配以及 GC 的详细分析,中篇会阐述 Android 内存泄漏的检测和内存泄漏的常见产生情景,下篇会

Android:应用开发进阶必经之路之性能优化(上)

前言 性能优化在一款产品的迭代过程中非常重要:程序实现了功能.还原产品原型只能保证程序能用,但如果要让用户更愿意使用,产品得好用.试想一下如果你开发的产品启动慢.页面显示需要长时间转圈加载.页面切换卡顿.黑白屏.用一会机器就发烫.耗内存.OOM.程序切换到后台后占用内存无法释放......,这些问题就像正在玩游戏时弹出提示框这类糟糕的用户体验一样让用户恼火,如果用户不得不使用你的产品,可能还会一直忍受:但如果有很多同类竞品,糟糕的用户体验会大大影响留存率.有时候产品在市场上的表现差,真不能全怪产

Spark性能调优之代码方面的优化

Spark性能调优之代码方面的优化 1.避免创建重复的RDD 对性能没有问题,但会造成代码混乱 2.尽可能复用同一个RDD,减少产生RDD的个数   3.对多次使用的RDD进行持久化(cache,persist,checkpoint) 如何选择一种最合适的持久化策略? 默认MEMORY_ONLY, 性能很高, 而且不需要复制一份数据的副本,远程传送到其他节点上(BlockManager中的BlockTransferService),但是这里必须要注意的是,在实际的生产环境中,恐怕能够直接用这种

性能优化 | 实现万行级数据读取优化

业务场景: 基于导出的功能上,要求一次性查询10w条数据.但是这个10w的开始值和结束值不固定(比如:startNum = 123; endNum = 100123;) 难点一: dubbox时间超时规定为1s,服务调用图如下: 难点二: 数据封装转换性能消耗较高,目前使用的BeanUtils 难点三: 并发能力很弱,在分割查询的过程中,如果有其他的服务进入,很容易导致数据混乱 公司使用的数据库为oracle,目前我自己实现的查询功能总耗时8s.这个时间能不能再次缩短?有没有比较好的方案对数据分

Android性能调优篇之UI布局优化

详细内容请查看我的简书地址:Android性能调优篇之UI布局优化 或者我的个人博客地址:Android性能调优篇之UI布局优化

若何综合一度上网站的seo优化状况

<p> <br>若何综合一度上网站的seo优化状况<br>怎样综合一度网站的SEO搜索引擎优化优化状况的呢?关于企业来说,怎样才可以晓得本人的网站优化的对比好,该怎样去评议本人的职工.单仁资讯昨天正在那儿那里引见一下怎么去综合一度站,万万没有能够是这样的高深,只说多余的那样若干好多点:<br>第一看:看网站规模与建站功夫<br>一般自己拿到一度站的时分先是扫描一下某个站的局限是年夜年夜是小,当然优化思绪都一样,实践操作兴起,年夜战正视的秘闻会愈加