iOS開發-tableView優化思路

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath

這個代理方法的實現,在可見的頁面是會重復繪制頁面的,所以絕大部分人都會在這里做一些代碼處理

比如:

static NSString *CellIdentifier = @"LazyTableCell";

UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];

很常規的,防止cell對象無限的被創建,等同于android里面適配器的方法

public View getView(int position, View convertView, ViewGroup arg2)

以上舉例代碼是可以讓cell被重復使用,一般大概只會在可見頁面部分的幾個cell會被new下,其他的全部重復使用前面已經有的cell對象,到時候只要填充數據就可以了

啰嗦下,android里面也是類似的處理的,給view添加tag值,到時候利用tag獲取view對象

那么僅僅只是如此,恐怕現在的cell自定義的頁面不只是文本那么簡單,多多少少都會帶有一些圖片吧,當你下滑時候是否發現有那么一點點的卡頓現成,特別是網絡不好,而且還是在iPhone4上跑的就會更明顯了

那么在cell里面異步加載圖片是個程序員都會想到,但是如果你給每個循環對象都加上異步加載,并且下滑的時候,這一操作將會被執行,雖然是異步,但是一個app里面的線程過多也會卡頓的,特別是在下滑操作的時候給每個圖片進行異步加載

那么這里可以利用UIScrollViewDelegate代理很好的解決這問題

- (void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate

- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView

可以識別tableview禁止或者減速滑動結束的時候進行異步加載圖片

以下方法來執行異步加載操作

//獲取可見部分的對象

NSArray *visiblePaths = [self.tableView indexPathsForVisibleRows];

for (NSIndexPath *indexPath in visiblePaths)

{

//獲取的dataSource里面的對象,并且判斷加載完成的不需要再次異步加載

}

同時在cell繪制中也做限制

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath

if (self.tableView.dragging == NO && self.tableView.decelerating == NO)

{

//開始異步加載圖片

}

如果tableview停止滑動的時候開始異步加載圖片

最后也別忘記在內存緊張的情況下釋放調所有的異步線程,以保證的你的app不會被系統強制關閉

- (void)didReceiveMemoryWarning{

//釋放調異步加載圖片的線程以及所有圖片資源對象

}

還有千萬別忘記銷毀的時候手動把所有的使用到的代理設置nil

至此性能優化結束,來源于官方文案

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容