我目前的方法是使用缓存。因为 heightForRowAtIndexPath 先于 cellForRowAtIndexPath 调用。那么在 heightForRowAtIndexPath 的时候初始化 cell,缓存起来。
cellForRowAtIndexPath 的时候,从缓存读取。
现在问题来了。。。。。
因为cell自身的复用机制所致,滚动的时候,出现一些问题。
如果彻底干掉cell自身飞复用机制,那么每次渲染初始化cell,太耗时间和内存了。
怎么都不行,如何是好?
我的代码如下:
//计算cell的高度,这里初始化cell了。那么缓存起来。
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {
FeedCell *cell = [self getCellFromIndexPath:indexPath];
return cell.frame.size.height;
}
//把Cell复用逻辑写在一个方法里
- (FeedCell*)getCellFromIndexPath:(NSIndexPath*)indexPath
{
Post *post = [self.dataSource objectAtIndex:indexPath.row];
NSString *key = [NSString stringWithFormat:@"%@%d_%d%d", CellIdentifier, post.pid, indexPath.row, indexPath.section];
FeedCell *cell = [self.cellCache objectForKey:key];//看看是否有cell的缓存。
if (!cell) {
//系统自身的复用机制。
cell = [self.feedTableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (!cell)
{
cell = [[FeedCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
}
[cell setAutoFrame];
cell.tag = post.pid;
[self.cellCache setObject:cell forKey:key];
}
return cell;
}
//因为计算cell高度的时候已经初始化了。那么这里从缓存读取。
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
return [self getCellFromIndexPath:indexPath];
}
编辑器对大片代码没法高亮,我反复折腾很久,代码排版不尽人意。
这确实是个很常见的问题。我目前见到有两种解决方法:
如果彻底干掉cell自身复用机制,那么每次渲染初始化cell,太耗时间和内存了。
看了下你的代码,觉得既然已经写成这样了,想少修改点,可以考虑把系统的cell复用干掉;如果在各个设备上滚动不卡顿,就可以采用。因为既然你已经把cell缓存起来了,干掉系统的复用并不会更耗内存。当然如果缓存策略是从不释放,而cell个数可能无限多的话,这样做是不可取的。
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。