我很好奇只要資源去UITableView的reloadData是多麼昂貴?我有一個應用程序將大約10個後續的HTTP請求,並且當它獲取數據/準備,它重新加載tableView。隨着數據集越來越大,它變得非常緩慢。我試圖找出是因爲我重新加載tableView的次數,或者因爲我如何抓取/解析數據。UITableView的reloadData有多昂貴?
這種情況下的最佳做法是什麼?
我很好奇只要資源去UITableView的reloadData是多麼昂貴?我有一個應用程序將大約10個後續的HTTP請求,並且當它獲取數據/準備,它重新加載tableView。隨着數據集越來越大,它變得非常緩慢。我試圖找出是因爲我重新加載tableView的次數,或者因爲我如何抓取/解析數據。UITableView的reloadData有多昂貴?
這種情況下的最佳做法是什麼?
最好的做法是讓您的實施cellForRowAtIndexPath:
做盡可能少的工作。實際上,除了使用它需要顯示的數據填充UITableViewCell
實例外,它實際上不應該做任何工作。
您應該使用緩存UITableViewCell
s,因此您不必每次都分配一個新的單元。如果您可以在單獨的線程中執行解析等操作,並將分析後的數據準備好呈現給cellForRowAtIndexPath:
,那麼您應該不會遇到任何性能問題。
您沒有說如果您使用的是自定義UITableViewCell
子類,但如果是的話,深層視圖層次結構也可能會出現性能問題,因爲層次結構中的每個視圖都會繪製。你可以製作更平坦,更好。
希望能讓你朝着正確的方向前進。
要做的最好的事情是分析您的應用程序,看看它的速度緩慢。
也就是說,如果你的表細胞都是相同的高度,那麼我認爲
reloadData
只需要調用
的cellForRowAtIndexPath
用於屏幕上可見的單元格。
開機自檢是正確的。
我在Instapaper中逐行進行文章列表更新,並在每次完成的下載中調用-reloadData。聽起來類似於你在做什麼。它不會導致任何明顯的性能下降。
表視圖重裝費用爲:
無論何時調用重載數據,行高都特別針對表中的所有元素計算出來。
剩餘的花費是cellForRowAtIndexPath,通常不會太糟糕,因爲它只被調用的行數與屏幕上的行數相同。如果您不重複使用像您應該使用的單元格,那麼滾動時可能會很糟糕。
您的關鍵可能是問自己觸發HTML加載的原因,並可能將其移入後臺線程。
從UITableView.h:
- (void)reloadData; // reloads everything from scratch. redisplays visible rows. because we only keep info about visible rows, this is cheap. will adjust offset if table shrinks
「這是便宜的。」
很好地實現了你的表視圖方法,並且始終調用這個函數並沒有什麼大不了的。
在附註上,如果您正在考慮使用reloadData,則應嘗試使用適當的方法來添加和移除行。
使用文檔+1! – wjl 2012-04-15 07:39:08
如果他正在發送HTTP請求,我相信這些將免費進行,除非你明確告訴它不要。 – 2014-02-05 21:29:11