2014-06-11 72 views
0

我正在使用顯示用戶聯繫人的UITableView。對於一些擁有大量聯繫人的用戶(5000+聯繫人),tableview也有5000多行。uitableview reloaddata方法阻塞uithread

具有〜12k行的democase中的reloadData方法在設備上需要100ms。

這些100毫秒時,作者「的tableView:heightForRowAtIndexPath:」本身就需要30毫秒,但實際上只是:

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    if(indexPath.row>50) 
    { 
     return 47 
    } 
    return 62; 
} 

這是由於這樣的事實,這就是所謂的1.2萬倍。

無論如何加快這一點?

+0

你確定它的reloadData需要這麼長時間,而不是實際重新加載數據源嗎? Tableview不會爲它重用的所有數據加載單元格。你如何重新加載數據源? – Yan

+1

查看文檔中的tableView:estimatedHeightForRowAtIndexPath:方法。爲了這個目的,它被添加到api中。 – rdelmar

+0

@Yan是的,我確定,因爲我在樂器中檢查過它。 –

回答

1

每蘋果UITableView的文檔:

「有使用的tableView性能影響:heightForRowAtIndexPath:對委託 :不是的rowHeight顯示一個 表視圖時,它都會調用的tableView:heightForRowAtIndexPath它的每一行都可能導致 顯着的性能問題,並且表視圖的行數很大(大約爲1000或更多)的數目爲 。

我強烈推薦一個不同的實現,無論是限制你的數據源爲一個較小的數字,只在需要時(即滾動)或其他方法增加它。

我剛剛創建非常簡單的類似的代碼20000行和被造細胞,當heightForRowAtIndexPath叫,只有10細胞最初被創造記錄,但計算全部20000個高度TWICE前這個看法甚至產生了。

+0

嘿,thx找到在文檔中。我想我必須找到一種方法使我的細胞具有相同的尺寸:/ –

+0

是的,這很糟糕,但如果我是你,尤其是考慮到兩個細胞的大小非常接近(只有15個區別.. 。) – Mike

1

除非您的單元格具有不同的高度或動態更改只是設置大小並且不覆蓋heightForRowAtIndexPath。這樣做的主要目的是讓每個細胞批次的大小不同,但花費時間。但是如果你的單元格大小相同,它可以根據存儲的值簡單地計算出來,而不是查詢每個單元格並將它們相加。

+0

感謝你的回答,我給你投了正確的建議後投了票,但@Mike實際上給了我蘋果的文件和更詳細的信息報價,因此我選擇了他的答案。抱歉! –

0

爲什麼要同時加載所有500個聯繫人? 如果它慢,只需加載前50個,如果用戶滾動到底部加載下一個項目等等。

+0

這並沒有什麼幫助,因爲在這種情況下,問題會發生在你非常非常地滾動時。這也是不好的,因爲當用戶開始非常快速的滾動(這可能是非常長的tableviews)加載50多個不會幫助。 –