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的高度从缓存中删除掉。