美文网首页ios
iOS开发笔记-tableView优化

iOS开发笔记-tableView优化

作者: chenzhy | 来源:发表于2018-03-01 11:46 被阅读24次

几乎每一款App都有很多的界面是由UITableView实现的,所以为了做出一款优秀的App,让用户有更好的体验效果,如何做好tableView的优化将是很重要的一环.

  • 要保证滚动tableView时,让用户有良好的体验,需要确保刷新帧率应该在 50+/s 才可以!(instrument中CoreAnnimation中可查看)

  • 不能因为cell展示不必要的内容浪费时间,出现跳帧现象,导致画面不连续,也就是说在两帧刷新之间,表格的运算必须做完,

一句话:要想滚动tableView时,能够非常流畅,最关键的是在创建cell或者从缓存池取cell时,让系统花费最少的时间,即尽可能的减少显示cell的计算量.

tableView的性能优化可以从下面几个方面着手:

1.行高一定要缓存!!!

举个简单的栗子: 如果现在要显示100个Cell,当前屏幕显示5个。那么全局刷新UITableView时, UITableView会先调用100次tableView:heightForRowAtIndexPath:方法,然后调用5次 tableView:cellForRowAtIndexPath:方法;滚动屏幕时,每当Cell滚入屏幕,都会调用 一次tableView:heightForRowAtIndexPath:和tableView:cellForRowAtIndexPath:方 法。 所以说要提前计算并缓存好高度,因为heightForRowAtIndexPath:是调用最频繁的方法,如果是使用MVVM搭建框架,可以在viewModel中添加行高属性,提前计算好行高.

2.不要动态创建子视图

意思是:cell所有的子视图都预先在初始化方法中创建,如果根据实际情况不需要显示的可以设置 hidden.这样能尽可能的减少cell创建或从缓存池取时因为布局子控件所消耗的时间.

3.所有的子视图都应该添加到 contentView 上

这一条和tableView的性能优化其实没多少关系,但添加到contentView中,当侧滑cell需要删除或编辑这行数据时更好操作.

4.所有的子视图都必须指定背景颜色

相信很多程序员在开发时经常会遇到这种情况,当从某个控制器A跳转到下一个控制器B时,若B控制器的view未设置背景颜色,跳转时会有卡顿现象,cell也一样,若控件未指定背景颜色,会影响tableView滚动的流畅度.

5.所有的颜色都不要使用 alpha

因为控件如有透明度,会显示底部控件的部分轮廓,系统在显示cell时,需要计算各控件间的叠加面积,颜色的透明度等;但如果所有控件颜色不透明,则不需要耗费性能去计算,能节省大量时间.

6.cell 栅格化

栅格化,是UI设计师的术语:是将 cell 中的所有内容,生成一张独立的图像,在屏幕滚动时,只显示图像 设置属性 self.layer.shouldRasterize = YES;即可 栅格化的同时必须指定分辨率,否则默认使用 1倍的scale 生成图像! 需要设置 self.layer.rasterizationScale = [UIScreen mainScreen].scale;

7.异步绘制 异步绘制!

如果 cell 比较复杂,可以设置cell图层的属性 self.layer.drawsAsynchronously = YES;

8.tableview加载图片的时候使用lazy(懒加载)模式和异步加载模式

举个栗子,当我们在用新闻类的App时,滑动cell时看新闻时,并不是所有的都是我们感兴趣的,有时候我们只是很快的滑过,想要快速的略过不喜欢的内容,但实际上只要滑动经过了的cell中的图片就开始加载了,这样用户使用起来会出现不同程度的卡顿,用户体验不太好,而且浪费内存和流量 此时,我们就可以利用lazy加载技术,当界面滑动或者滑动减速的时候,都不进行图片加载,只有当用户不再滑动并且减速效果停止的时候,才进行加载.

9.正确使用reuseIdentifier来重用Cells

当一个tableView中有多种类型的cell时,需要定义不同的重用标识,确保在缓存池正确找到重用的cell.

10.利用Runloop优化流畅度

我们可以对runloop添加观察者,当观察到状态为kCFRunLoopExit,kCFRunLoopBeforeWaiting的时候,做一些耗时的处理,废话不说,直接上代码

- (void)viewDidLoad {
    [super viewDidLoad];

    self.view.backgroundColor = [UIColor redColor];

    UITableView *tableView = [[UITableView alloc] initWithFrame:self.view.bounds];
    [self.view addSubview:tableView];
    tableView.delegate = self;
    tableView.dataSource = self;

//    for (int i = 0; i < 100000; i ++){
//        UIView *view = [UIView new];
//        [self.view addSubview:view];
//    }

    __block NSMutableArray *arr = [[NSMutableArray alloc] init];
    for (int i = 0; i < 10000; i ++){
        [arr addObject:@0];
    }
    NSLog(@"添加完了");
    _arr = arr;

    _observer = CFRunLoopObserverCreateWithHandler(CFAllocatorGetDefault(), kCFRunLoopAllActivities, YES, 0, ^(CFRunLoopObserverRef observer, CFRunLoopActivity activity) {
        NSLog(@"----监听到RunLoop状态发生改变---%zd", activity);

        if ((activity == kCFRunLoopExit || activity == kCFRunLoopBeforeWaiting )  && arr.count > 0){

                UIView *view = [UIView new];
                [self.view addSubview:view];
                [arr removeObjectAtIndex:0];
                NSLog(@"还有%ld",arr.count);


            CFRunLoopWakeUp(CFRunLoopGetCurrent());
        }

    });
    CFRunLoopAddObserver(CFRunLoopGetCurrent(), _observer, kCFRunLoopDefaultMode);


    CFRelease(_observer);
}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{
    return 1000;
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"123"];
    if (!cell){
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleValue1 reuseIdentifier:@"123"];
    }
    cell.backgroundColor = [UIColor colorWithRed:arc4random_uniform(256)/255.0 green:arc4random_uniform(256)/255.0 blue:arc4random_uniform(256)/255.0 alpha:1.0];

    return cell;
}
- (void)dealloc {
    CFRunLoopRemoveObserver(CFRunLoopGetCurrent(), _observer, kCFRunLoopCommonModes);
}

这里tableView滑动的时候是不会创建view的,只有滑动结束的时候才会继续创建,这主要用在不是很着急使用的场景对流畅度进行一定的优化

相关文章

网友评论

    本文标题:iOS开发笔记-tableView优化

    本文链接:https://www.haomeiwen.com/subject/svkgxftx.html