cell高度的缓存1——利用字典进行缓存

在iOS项目开发中会遇到这样一个问题:确定cell的高度。对于cell高度固定的页面来说这个很好办直接在heightForRowAtIndexPath方法中返回固定的一个数值就行。然而对于cell高度不固定的页面来说却需要我们开发人员计算出cell的高度。

笔者之前通常会会将计算cell高度的代码放在heightForRowAtIndexPath方法中,看代码:

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath{

    

     TopicModel * model = self.dataSource[indexPath.row];

cellHeight == 0.f

        cellHeight += 30;

        NSString * text = model.text;

        NSMutableDictionary * dic = [NSMutableDictionary dictionary];

        dic[NSFontAttributeName] = [UIFont systemFontOfSize:17];

        CGRect textRect = [text boundingRectWithSize:CGSizeMake(WIDTH-20, MAXFLOAT) options:NSStringDrawingUsesLineFragmentOrigin attributes:dic context:nil];

        cellHeight += textRect.size.height;

        cellHeight += 30;


    return cellHeight;

}


上面的代码虽然能计算出cell的高度实现想要的效果,可会有一个耗性能的问题:即使之前计算过某个cell的高度,在这个cell在此展示出来的时候还会再次调用heightForRowAtIndexPath这个方法,从而再次地计算这个cell的高度。这样就会进行多余的操作,造成资源的浪费。在这种情况下,我们应该将之前计算出的cell高度进行缓存,下次这些cell要再次展示的时候就从缓存中获取之前计算出的cell高度,而不用进行多余的计算操作。

我们利用字典对cell高度进行缓存,而且为了区分每个cell,我们将每个cell对应的模型的唯一标识description作为字典的key。代码:

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath{

    

     TopicModel * model = self.dataSource[indexPath.row];

    CGFloat cellHeight = [self.cellHeightDic[model.description] floatValue];    // 从字典中取出cell的高度

    if (cellHeight == 0.f) {    // 如果字典中没有存储cell的高度

        cellHeight += 30;

        NSString * text = model.text;

        NSMutableDictionary * dic = [NSMutableDictionary dictionary];

        dic[NSFontAttributeName] = [UIFont systemFontOfSize:17];

        CGRect textRect = [text boundingRectWithSize:CGSizeMake(WIDTH-20, MAXFLOAT) options:NSStringDrawingUsesLineFragmentOrigin attributes:dic context:nil];

        cellHeight += textRect.size.height;

        cellHeight += 30;

        

        // 将cell的高度存储到字典中

        [self.cellHeightDic setObject:@(cellHeight) forKey:model.description];

//        NSLog(@"%f", cellHeight);

    }

    

    return cellHeight;

}

为了更完善些,我们还应该在下拉刷新tableview执行reloadData之后将存储cell高度的字典清空以防字典中的数据越来越多。


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
可以使用Python中的csv模块和字典对象来处理CSV文件并根据字典进行替换。具体步骤如下: 1. 使用csv模块读取CSV文件,可以使用csv.reader函数来读取每行数据并返回一个列表对象。 2. 创建一个字典对象,将需要替换的内容作为字典的key,替换后的内容作为value。 3. 遍历CSV文件中的每行数据,将需要替换的内容通过字典的get()方法获取替换后的值,替换掉原始的内容。 4. 将替换后的数据写回到CSV文件中,可以使用csv.writer函数将数据写入文件。 以下是一个简单的示例代码: ```python import csv # 读取CSV文件 with open('example.csv', 'r') as f: reader = csv.reader(f) rows = list(reader) # 创建字典对象 replace_dict = { 'apple': 'orange', 'cat': 'dog', 'red': 'blue' } # 遍历CSV文件中的每行数据,进行替换 for i, row in enumerate(rows): for j, cell in enumerate(row): if cell in replace_dict: rows[i][j] = replace_dict[cell] # 将替换后的数据写回到CSV文件中 with open('example_new.csv', 'w', newline='') as f: writer = csv.writer(f) writer.writerows(rows) ``` 在上面的代码中,我们首先读取了名为`example.csv`的CSV文件,然后创建了一个字典对象`replace_dict`来存储需要替换的内容。接着,我们遍历了CSV文件中的每行数据,如果某个单元格中的内容在字典对象中存在,则将其替换成字典中对应的值。最后,我们将替换后的数据写回到了名为`example_new.csv`的文件中。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值