关于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
至此性能优化结束android

相关文章
相关标签/搜索