關於UITableView的性能優化

- (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裏面的對象,而且判斷加載完成的不須要再次異步加載
             <code>
        }


同時在cell繪製中也作限制
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath

         if (self.tableView.dragging == NO && self.tableView.decelerating == NO)
            {
               //開始異步加載圖片
                <code>
            }

若是tableview 中止滑動的時候開始異步加載圖片



最後也別忘記在內存緊張的狀況下釋放調全部的異步線程,以保證的你的app不會被系統強制關閉
- (void)didReceiveMemoryWarning{
//  釋放調異步加載圖片的線程以及全部圖片資源對象
<code>
}
還有千萬別忘記銷燬的時候手動把全部的使用到的代理設置nil
至此性能優化結束android

相關文章
相關標籤/搜索