UITableView-FDTemplateLayoutCell是一個自動計算cell高度並緩存從而達到順滑滾動tableview的效果。github地址戳這裏git
基本原理是經過緩存每一個cell的高度,當tableview回調delegate的heightForRowAtIndexPath的時候,省去了計算cell高度計算,極大的提升了tableview的滑動體驗。github
由於 heightForRowAtIndexPath這個接口會在reloadData的時候,每一個cell都會調用一次,同時滾動tableview的時候,cell從不可見到可見區域也會被調用一次heightForRowAtIndexPath,因此這個API的調用是很頻繁的。因爲每一個cell的高度是動態的,因此每次要作高度計算,都要從新layout一遍,而後得出高度,這塊計算量是比較大的。sunny經過將每一個cell的計算好的高度緩存起來,下次獲取相同位置cell的高度的時候,直接返回緩存的高度。
緩存
同時,當第一次reloadData,或者cell的行數發生變化(增減行,section) ,會先在tableview不處於滾動狀態的時候異步計算那些沒有被計算過的cell的高度,作預緩存,這塊很是贊。就是使用者須要當心,因爲這塊是異步的, tableview delegate有可能會在預緩存計算的時候不存在了,致使程序崩潰,因此使用者在tableview須要析構的時候,在對應的tableview controller的dealloc中講self.tableview.delegate = nil;,確保delegate後續不會是一個髒對象。異步
fd_heightForCellWithIdentifier: cacheByIndexPath: configuration: ide
fd_heightForCellWithIdentifier: configurationoop
fd_templateCellForReuseIdentifier佈局
fd_precacheIfNeededui
這個方法會在第一次計算行高,或者tableview的數據發生改變的時候(reloadData,增減行,sections)被異步調用。spa
這塊會對全部須要預先計算的cell都計算一次行高對象
很喜歡sunny的這塊處理,小而精巧。有關RunLoop的深刻介紹,參見這篇強文-深刻理解RunLoop
FDTemplateLayoutCellAutomaticallyCacheInvalidation
這個category的目的是利用swizzle機制重寫了涉及數據變化的delegate方法,例如reloadData, nsertRowsAtIndexPaths等。當回調delegate的這些方法的時候,其實是回調對應的fd_開頭的同名方法,在這些方法裏面作對應的緩存高度操做,或者預緩存新產生的cell高度,或者講刪除cell的高度從緩存中刪除掉。