為UITableViewCell 高度自適應加速

前面我的一篇博文UITableViewCell 高度自適應擴展中說到了可以緩存Cell高度提高性能田巴!下面為大家講述如何添加緩存提高性能允耿!先看兩張用Time Profiler測試的緩存前后的耗時對比:

重點看函數(shù)heightForRowAtIndexPath

沒加緩存前

timeProfile.gif

添加緩存后

recordTime2.gif

前后對比差距是巨大的,計算高度這里減少的時間大約是五到六倍


如何添加緩存品抽?

  • 新建一個緩存高度的類取名:ZHCellHeightCalculator

ZHCellHeightCalculator.h代碼

@interface ZHCellHeightCalculator : NSObject

//系統(tǒng)計算高度后緩存進cache
-(void)setHeight:(CGFloat)height withCalculateheightModel:(ZHCalculateHeightModel *)model;

//根據(jù)model hash 獲取cache中的高度,如過無則返回-1
-(CGFloat)heightForCalculateheightModel:(ZHCalculateHeightModel *)model;

//清空cache
-(void)clearCaches;

@end

ZHCellHeightCalculator.m代碼

#import "ZHCellHeightCalculator.h"

@interface ZHCellHeightCalculator ()
@property (strong, nonatomic, readonly) NSCache *cache;
@end

@implementation ZHCellHeightCalculator

#pragma mark - Init
-(instancetype)init
{
    self = [super init];
    if (self) {
        [self defaultConfigure];
    }
    return self;
}

-(void)defaultConfigure
{
    NSCache *cache = [NSCache new];
    cache.name = @"ZHCellHeightCalculator.cache";
    cache.countLimit = 200;
    _cache = cache;

}

#pragma mark - NSObject

- (NSString *)description
{
    return [NSString stringWithFormat:@"<%@: cache=%@",
            [self class], self.cache];
}

#pragma mark - Publci Methods
-(void)clearCaches
{
    [self.cache removeAllObjects];
}


-(void)setHeight:(CGFloat)height withCalculateheightModel:(ZHCalculateHeightModel *)model
{
    NSAssert(model != nil, @"Cell Model can't  nil");
    NSAssert(height >= 0, @"cell height must greater than or equal to 0");
    
    [self.cache setObject:[NSNumber numberWithFloat:height] forKey:@(model.hash)];
}


-(CGFloat)heightForCalculateheightModel:(ZHCalculateHeightModel *)model
{
    NSNumber *cellHeightNumber = [self.cache objectForKey:@(model.hash)];
    if (cellHeightNumber) {
        return [cellHeightNumber floatValue];
    }else
        return -1;
    
}
@end

修改ZHCustomLayoutTableViewController.mheightForRowAtIndexPath方法如下:

-(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
   ZHCalculateHeightModel *model = model = [dataArray objectAtIndex:indexPath.row];
    
    CGFloat height = [heightCalculator heightForCalculateheightModel:model];
    if (height>0) {
        NSLog(@"cache height");
        return height;
    }else{
        NSLog(@"calculate height");
    }
    ZHCalculateTableViewCell *cell = self.prototypeCell;
    cell.contentView.translatesAutoresizingMaskIntoConstraints = NO;
    [self configureCell:cell atIndexPath:indexPath];//必須先對Cell中的數(shù)據(jù)進行配置使動態(tài)計算時能夠知道根據(jù)Cell內(nèi)容計算出合適的高度
    
    /*------------------------------重點這里必須加上contentView的寬度約束不然計算出來的高度不準確-------------------------------------*/
    CGFloat contentViewWidth = CGRectGetWidth(self.tableView.bounds);
    NSLayoutConstraint *widthFenceConstraint = [NSLayoutConstraint constraintWithItem:cell.contentView attribute:NSLayoutAttributeWidth relatedBy:NSLayoutRelationEqual toItem:nil attribute:NSLayoutAttributeNotAnAttribute multiplier:1.0 constant:contentViewWidth];
    [cell.contentView addConstraint:widthFenceConstraint];
    // Auto layout engine does its math
    CGFloat fittingHeight = [cell.contentView systemLayoutSizeFittingSize:UILayoutFittingCompressedSize].height;
    [cell.contentView removeConstraint:widthFenceConstraint];
    /*-------------------------------End------------------------------------*/
    
    CGFloat cellHeight = fittingHeight+2*1/[UIScreen mainScreen].scale;//必須加上上下分割線的高度
    [heightCalculator setHeight:cellHeight withCalculateheightModel:model];
    return cellHeight;
}

Demo 下載地址

GitHub

最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末卑笨,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子炼列,更是在濱河造成了極大的恐慌只搁,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,576評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件俭尖,死亡現(xiàn)場離奇詭異氢惋,居然都是意外死亡,警方通過查閱死者的電腦和手機稽犁,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,515評論 3 399
  • 文/潘曉璐 我一進店門焰望,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人已亥,你說我怎么就攤上這事熊赖。” “怎么了虑椎?”我有些...
    開封第一講書人閱讀 168,017評論 0 360
  • 文/不壞的土叔 我叫張陵震鹉,是天一觀的道長。 經(jīng)常有香客問我绣檬,道長足陨,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,626評論 1 296
  • 正文 為了忘掉前任娇未,我火速辦了婚禮墨缘,結果婚禮上,老公的妹妹穿的比我還像新娘零抬。我一直安慰自己镊讼,他們只是感情好,可當我...
    茶點故事閱讀 68,625評論 6 397
  • 文/花漫 我一把揭開白布平夜。 她就那樣靜靜地躺著蝶棋,像睡著了一般。 火紅的嫁衣襯著肌膚如雪忽妒。 梳的紋絲不亂的頭發(fā)上玩裙,一...
    開封第一講書人閱讀 52,255評論 1 308
  • 那天,我揣著相機與錄音段直,去河邊找鬼吃溅。 笑死,一個胖子當著我的面吹牛鸯檬,可吹牛的內(nèi)容都是我干的决侈。 我是一名探鬼主播,決...
    沈念sama閱讀 40,825評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼喧务,長吁一口氣:“原來是場噩夢啊……” “哼赖歌!你這毒婦竟也來了枉圃?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 39,729評論 0 276
  • 序言:老撾萬榮一對情侶失蹤庐冯,失蹤者是張志新(化名)和其女友劉穎孽亲,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體展父,經(jīng)...
    沈念sama閱讀 46,271評論 1 320
  • 正文 獨居荒郊野嶺守林人離奇死亡墨林,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,363評論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了犯祠。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,498評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡酌呆,死狀恐怖衡载,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情隙袁,我是刑警寧澤痰娱,帶...
    沈念sama閱讀 36,183評論 5 350
  • 正文 年R本政府宣布,位于F島的核電站菩收,受9級特大地震影響梨睁,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜娜饵,卻給世界環(huán)境...
    茶點故事閱讀 41,867評論 3 333
  • 文/蒙蒙 一坡贺、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧箱舞,春花似錦遍坟、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,338評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至电湘,卻和暖如春隔节,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背寂呛。 一陣腳步聲響...
    開封第一講書人閱讀 33,458評論 1 272
  • 我被黑心中介騙來泰國打工怎诫, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人昧谊。 一個月前我還...
    沈念sama閱讀 48,906評論 3 376
  • 正文 我出身青樓刽虹,卻偏偏與公主長得像,于是被迫代替她去往敵國和親呢诬。 傳聞我的和親對象是個殘疾皇子涌哲,可洞房花燭夜當晚...
    茶點故事閱讀 45,507評論 2 359

推薦閱讀更多精彩內(nèi)容