2009-02-27 127 views
5

我很好奇只要資源去UITableView的reloadData是多麼昂貴?我有一個應用程序將大約10個後續的HTTP請求,並且當它獲取數據/準備,它重新加載tableView。隨着數據集越來越大,它變得非常緩慢。我試圖找出是因爲我重新加載tableView的次數,或者因爲我如何抓取/解析數據。UITableView的reloadData有多昂貴?

這種情況下的最佳做法是什麼?

回答

5

最好的做法是讓您的實施cellForRowAtIndexPath:做盡可能少的工作。實際上,除了使用它需要顯示的數據填充UITableViewCell實例外,它實際上不應該做任何工作。

您應該使用緩存UITableViewCell s,因此您不必每次都分配一個新的單元。如果您可以在單獨的線程中執行解析等操作,並將分析後的數據準備好呈現給cellForRowAtIndexPath:,那麼您應該不會遇到任何性能問題。

您沒有說如果您使用的是自定義UITableViewCell子類,但如果是的話,深層視圖層次結構也可能會出現性能問題,因爲層次結構中的每個視圖都會繪製。你可以製作更平坦,更好。

希望能讓你朝着正確的方向前進。

+0

如果他正在發送HTTP請求,我相信這些將免費進行,除非你明確告訴它不要。 – 2014-02-05 21:29:11

4

要做的最好的事情是分析您的應用程序,看看它的速度緩慢。

也就是說,如果你的表細胞都是相同的高度,那麼我認爲

reloadData

只需要調用

的cellForRowAtIndexPath

用於屏幕上可見的單元格。

1

開機自檢是正確的。

我在Instapaper中逐行進行文章列表更新,並在每次完成的下載中調用-reloadData。聽起來類似於你在做什麼。它不會導致任何明顯的性能下降。

2

表視圖重裝費用爲:

  1. 搞清楚你有多少部分,每個部分 行具有
  2. 讓行高度。

無論何時調用重載數據,行高都特別針對表中的所有元素計算出來。

剩餘的花費是cellForRowAtIndexPath,通常不會太糟糕,因爲它只被調用的行數與屏幕上的行數相同。如果您不重複使用像您應該使用的單元格,那麼滾動時可能會很糟糕。

您的關鍵可能是問自己觸發HTML加載的原因,並可能將其移入後臺線程。

15

從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

使用文檔+1! – wjl 2012-04-15 07:39:08