UITableView是我們開發過程中最常用的UI之一,因此掌握UITableView的優化方法,在我們開發的過程中能事半功倍。長話段數,直接進入優化的方法之中。
主要分為以下幾點:
1只定義一種Cell。
2提前計算并緩存每個Cell的高度。
3提前創建真正顯示的、需要加工的數據并緩存。
4緩存View!
其它(使用不透明的圖片,減少子視圖的添加,不要阻塞主線程,避免使用圖形特效)
1、只定義一種cell
? ? ? ? ? 對于需要展示大量數據的UI控件UITableView ,一般我們都會采用自定義的UITableviewcell的方式進行數據的展示。每個cell所展示的數據不一致,但是展示的樣式都大同小異。如下圖:
其cell的組成方式無非下圖各個子控件組成的。可以通過View的hidden = YES和hidden = NO來進行控制。
2、提前緩存cell的高度
首先要確定的是,在iOS中,系統會先調用“tableView:heightForRowAtIndexPath:”獲取每個Cell即將顯示的高度,從而確定整個UITableView的布局。然后才調用“tableView:cellForRowAtIndexPath”獲取每個Cell,我們也是在這里填充、設置Cell的。
所以,既然高度總會被用到,那就早早的在獲取數據時就計算好吧!
在Model(Entity)中計算并保存Cell的高度
其實,在Model(Entity)中保存UI的參數是很奇怪的=。=(最好放在ViewModel中,就是MVVM模式的),我們的Entity可能就是下面的樣子:
@interfaceDataEntity :NSObject//原始數據
@property(copy,nonatomic)NSString *content;
@property(copy,nonatomic)NSString *title;//Cell 高度
@property(assign,nonatomic)CGFloat cellHeight;
//計算高度
- (void)calculateCellHeight;@end
這樣,就不用在“tableView:heightForRowAtIndexPath:”中每次都計算了。
3、提前創建真正顯示的、需要加工的數據并緩存
Cell中顯示的內容,很多時候可能并不是直接從服務器拿到的數據,而是經過“加工”的數據。如本文中的“動態”也,每個Cell的標題、正文都有可點擊的連接Link、表情圖片等富文本內容,而我們一般用NSAttributeString類來顯示。
既然每次都會用到,倒不如在獲取到數據的時候就創建、加工好這些內容,等到需要現實的時候,直接拿來用不就行了。
所以,我們的Entity類可能變成下面這個樣子:
@interfaceDataEntity :NSObject
//原始數據
@property(copy,nonatomic)NSString *content;
@property(copy,nonatomic)NSString *title;
//Cell 高度
@property(assign,nonatomic)CGFloat cellHeight;
//真正顯示的內容
@property(strong,nonatomic)NSAttributedString *showTitle;
@property(strong,nonatomic)NSAttributedString *showContent;
//計算高度
- (void)calculateCellHeight;
//創建、加工真正顯示的內容
- (void)setupShowTitileAndContent;
@end
這樣,在“tableView:cellForRowAtIndexPath”中,我們直接拿showTitle、showContent來顯示就好,不用再創建。