2015-11-21 31 views
0

我在第一次滾動時遇到了我的tableview過度切斷的問題。一旦所有單元格都顯示出來,滾動變得非常平滑。該表有720行。第一次滾動時表格視圖非常波動通過

Video of problem

我的手機設置類似於|圖像(32x32) - 標籤 - 圖像(75x22) - 圖像(75x22)| :my cell

我在iPhone 6s上測試這個。資產目錄中的圖像位於@ 2x插槽中,左圖像尺寸爲64x64,右圖像尺寸爲150x44。他們的文件大小是5-9kb。我沒有對細胞高度做任何改變。使用默認的44

繼承人我的代碼:

override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { 
    let cell = tableView.dequeueReusableCellWithIdentifier("PokedexCell", forIndexPath: indexPath) as! PokedexCell 

    cell.thumb.image = UIImage(named: "\(dex[indexPath.row].name!)Thumb") 
    cell.name.text = dex[indexPath.row].name 
    if dex[indexPath.row].type2 == nil { 
     cell.type1.image = nil 
     cell.type2.image = UIImage(named: dex[indexPath.row].type1!) 
    } else { 
     cell.type1.image = UIImage(named: dex[indexPath.row].type1!) 
     cell.type2.image = UIImage(named: dex[indexPath.row].type2!) 
    } 
    // check to make sure cells are being reused. 
    if cell.tag != 999 { 
     cell.tag = 999 
     print("cell \(++self.cells)") 
    } 
    return cell 
} 

如果我刪除,設置拇指圖像行,表完美的作品。我也不瞭解內存使用情況。

拇指形象:推出= 12.2MB,全部滾動到行720 = 75.5mb方式

沒有拇指圖像(?!?!):推出= 10.3MB,全部滾動到行720路= 12.1mb

因此,讓我們只是說每個拇指圖像是10kb,如果所有被加載的都是最大約7mb。

任何幫助/想法將不勝感激!

UPDATE:

試圖zp_x的建議做此:

var thumbs : [UIImage] = [] 
func getThumbs() { 
    for x in 0...719 { 
     thumbs.append(UIImage(named: "\(dex[x].name!)Thumb")!) 
    } 
} 

呼叫getThumbs()在viewDidLoad中。這完全消除了簡陋,但該應用程序現在需要大約7秒鐘來加載頁面。另外,一旦加載的內存使用量從〜114mb開始,但一直滾動到最後一行,只會將使用量增加到〜126mb。此外,滾動時的CPU使用率也比以前高得多。

有沒有人有一個想法拇指圖像發生了什麼?我不瞭解內存使用情況會如何增加。拇指的文件大小從5-9kb。所以甚至說10KB在最大* 720拇指= 7200kb〜7mb。所以很困惑......

+0

不確定這是否有幫助,但你可以試試。您可以嘗試將所有圖像加載到viewDidLoad方法中的數組或字典中,而不是直接從數組或字典中讀取圖像。 – Surely

回答

0

試着在你身上做這件事cellForRowAtIndexPath 你應該嘗試加載異步塊中的資產,這有助於在很大程度上提高性能。

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0)) {() -> Void in 
      //Start the process to read the image. 

      dispatch_sync(dispatch_get_main_queue(), {() -> Void in 
       //set the image in here. 
       cell.thumb.image = UIImage(named: "\(dex[indexPath.row].name!)Thumb") 
       if dex[indexPath.row].type2 == nil { 
        cell.type1.image = nil 
        cell.type2.image = UIImage(named: dex[indexPath.row].type1!) 
       } else { 
        cell.type1.image = UIImage(named: dex[indexPath.row].type1!) 
        cell.type2.image = UIImage(named: dex[indexPath.row].type2!) 
       } 

      }) 
     } 
+0

用我原來的代碼試了一下,大大提高了性能,但滾動速度非常快時仍然有點波濤洶涌。代碼究竟在幹什麼? – mdaul87

+0

你是否在這個區塊內設置了所有圖像? –

+0

我已經完全按照你的要求使用它了。我還應該在這裏移動其他2張圖片嗎? – mdaul87

0

您正在加載所有圖片synchonous。從bundle的資源中加載圖片時,iOS緩存它們(所以:它們不會被卸載)。這就是爲什麼第二次滾動會順利。

您應該對所有圖像進行預處理(通過爲每個圖像調用UIImang(named :)),或者在單獨的線程中觸發UIImage(命名:)並將UIImage對象移交到主線程上的圖像視圖。

+0

因此可以說我想在應用程序第一次啓動時預緩存所有圖像,例如顯示加載屏幕時。我怎麼能這樣做?我從來沒有做過任何緩存之前,這是我的第一個應用程序 – mdaul87

+0

我不建議這樣做。您的應用程序可能會收到內存警告並被操作系統殺死。此外,這對電池有很大的影響。只需按照上面的建議嘗試dispatch_async(...)即可。 – Anticro

相關問題