iOS列表UITableView性能優化之cell繪製

  • 序言
    在咱們開發工做平常中常常會碰見用UITableView處理列表頁面,自定義cell也是經常使用方式。在整個列表優化不一樣方案中今天就從一般初級的自定義cell視圖換成cell的繪製這一角度來進行演示和講解。
  • 前提條件 -- iOS的繪製機制
    iOS中全部的view繪圖工做均在 drawRect 方法中完成,cell固然也不例外。通常狀況下只會繪製一次。若是咱們想本身繪製view的內容,那麼須要重寫drawRect方法,並且蘋果不建議直接調用此方法,若是須要的話 調用setNeedsDisplay方法會自動調用drawRect方法,也就是從新繪製一次視圖。
  • 用繪製視圖的方法代替用控件堆起來的自定義視圖,視圖加載速度會快數10倍甚至100倍。
    下面咱們來看代碼:
    圖片描述圖片描述

    這是自定義cell的UI代碼,用masonry進行佈局約束。計算出了cell加載前和加載後的時間差且打印。下面來看下打印信息:性能優化

    第 0 行cell加載消耗 0.012509 秒
    第 1 行cell加載消耗 0.001275 秒
    第 2 行cell加載消耗 0.000981 秒
    第 3 行cell加載消耗 0.000905 秒
    第 4 行cell加載消耗 0.000892 秒
    第 5 行cell加載消耗 0.000891 秒
    第 6 行cell加載消耗 0.000888 秒
    第 7 行cell加載消耗 0.000903 秒
    第 8 行cell加載消耗 0.000895 秒
    第 9 行cell加載消耗 0.000888 秒佈局

打印信息能夠看出加載這種簡單樣式cell時間消耗仍是挺快的,平均0.00幾秒。那麼咱們來看下cell繪製的方式來展示界面視圖的方式效果如何。下面是重寫celldrawRect方法,把cell中的三部分進行繪製:性能

- (void)drawRect:(CGRect)rect {

// 頭像
CGRect  imageViewRect  = CGRectMake(15, 15, 30, 30);
UIImage *iconImage  = [UIImage imageNamed:@"images"];
[iconImage drawInRect:imageViewRect];

// 姓名
CGFloat fontSize = 16;
NSString *name = @"大白";
CGFloat width = rect.size.width - 60;
UIFont *nameFont = [UIFont boldSystemFontOfSize:fontSize];
NSDictionary *attrs = @{NSFontAttributeName : nameFont};

[name drawInRect:CGRectMake(60, 8, width, 20) withAttributes:attrs];

// 內容
NSString *content = @"這是大白想說的話";
[content drawInRect:CGRectMake(60, 35, width, 20) withAttributes:attrs];

}優化

達到一樣的效果來看下運行時間打印:spa

2018-08-25 11:50:56.985876+0800 列表性能優化方案[1549:82858] 第 0 行cell加載消耗 0.000415 秒
2018-08-25 11:50:56.991175+0800 列表性能優化方案[1549:82858] 第 1 行cell加載消耗 0.000167 秒
2018-08-25 11:50:56.991874+0800 列表性能優化方案[1549:82858] 第 2 行cell加載消耗 0.000066 秒
2018-08-25 11:50:56.992405+0800 列表性能優化方案[1549:82858] 第 3 行cell加載消耗 0.000066 秒
2018-08-25 11:50:56.992927+0800 列表性能優化方案[1549:82858] 第 4 行cell加載消耗 0.000065 秒
2018-08-25 11:50:56.993470+0800 列表性能優化方案[1549:82858] 第 5 行cell加載消耗 0.000086 秒
2018-08-25 11:50:56.994018+0800 列表性能優化方案[1549:82858] 第 6 行cell加載消耗 0.000084 秒
2018-08-25 11:50:56.994520+0800 列表性能優化方案[1549:82858] 第 7 行cell加載消耗 0.000062 秒
2018-08-25 11:50:56.995033+0800 列表性能優化方案[1549:82858] 第 8 行cell加載消耗 0.000068 秒
2018-08-25 11:50:56.995558+0800 列表性能優化方案[1549:82858] 第 9 行cell加載消耗 0.000080 秒3d

能夠看出,用繪製方式要比通常的自定義視圖方式平均快了兩個小數點級別。並且這仍是在drawRect方法內容代碼沒有進行任何優化的狀況下、這只是簡單的cell元素個數比較少的狀況下。若是遇見覆雜視圖的話,這種對比應該更明顯。code

從代碼維護角度來看,代碼會比較難維護,可是一旦界面穩定下來的狀況下就能夠用繪製方式代替複合視圖。blog

  • 最後歡迎你們指出不足之處,但願可以交流共同進步~~
相關文章
相關標籤/搜索