美文网首页程序员
UITableView在tableView:cellForRow

UITableView在tableView:cellForRow

作者: Billlin | 来源:发表于2018-03-07 19:26 被阅读0次

    创建NSDateFormatter对象是比较耗时的操作,特别是在tableView滑动过程中大量创建NSDateFormmatter对象将会导致tableView滑动明显卡顿。

    - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
        static NSString *cellI = @"cell";
        
        UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellI];
        if (!cell) {
            cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:cellI];
        }
        cell.textLabel.text = [NSString stringWithFormat:@"Item %ld", indexPath.row];
        
        for (int i = 0; i < 30; i++) {
            NSString *timeStr = @"20171111 11:11:11";
            
            NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
            [formatter setDateFormat:@"yyyyMMdd HH:mm:ss"];
            [formatter setTimeZone:[NSTimeZone timeZoneWithAbbreviation:@"UTC"]];
            
            NSDate *timeDate = [formatter dateFromString:timeStr];
            double time = [timeDate timeIntervalSince1970];
            cell.detailTextLabel.text = [NSString stringWithFormat:@"%f", time];
        }
        
        return cell;
    }
    

    上面的代码在tableView的滑动过程中FPS只有30帧左右,看起来有明显的卡顿。

    解决办法:

    我们只需要创建一个NSDateFormatter对象,在tableView滑动的过程中复用这个NSDateFormatter对象。

    - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
        static NSString *cellI = @"cell";
        
        UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellI];
        if (!cell) {
            cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:cellI];
        }
        cell.textLabel.text = [NSString stringWithFormat:@"Item %ld", indexPath.row];
        
        for (int i = 0; i < 30; i++) {
            NSString *timeStr = @"20171111 11:11:11";
            
            static NSDateFormatter *formatter = nil;
            if (formatter == nil) {
                formatter = [[NSDateFormatter alloc] init];
                [formatter setDateFormat:@"yyyyMMdd HH:mm:ss"];
                [formatter setTimeZone:[NSTimeZone timeZoneWithAbbreviation:@"UTC"]];
            }
            
            NSDate *timeDate = [formatter dateFromString:timeStr];
            double time = [timeDate timeIntervalSince1970];
            cell.detailTextLabel.text = [NSString stringWithFormat:@"%f", time];
        }
        
        return cell;
    }
    

    代码改成上面这种后tableView在滑动过程中FPS也一直保持60帧,滑动非常顺畅。

    UITableView Custom Cell very slow

    相关文章

      网友评论

        本文标题:UITableView在tableView:cellForRow

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