2012-06-03 151 views
0

我有處理設備地址簿的表,該表可以輕鬆地有500多個聯繫人。 除了表得到更新,每3秒鐘,然後在每次更新運行代碼有很多行的UITableView性能

[tableContacts beginUpdates]; 
[tableContacts reloadRowsAtIndexPaths:arr withRowAnimation:UITableViewRowAnimationNone]; 
[tableContacts endUpdates]; 

,我更新的小區和一個圖像(存在)的文本。 單元格的所有計算都是後臺線程上的句柄。問題是大多數時候滾動不夠流暢。 當我觸摸表開始滾動然後滾動沒有響應1秒左右(我認爲是因爲表刷新在這個時間)。

所以問題是如何處理非常長的表在短時間內獲取數據並需要刷新?

回答

0

有一個簡單的方法和正確的方法,但無論如何 - 不要重新加載行。通過[self.tableView cellForRowAtIndexPath:]獲取單元格並更改它們的屬性,這是第一個。然後,在桌面上執行強制更新。

什麼是您的表的實際數據源?是NSFetchedResultsController?它是一些in-controller NSArray?無論如何,你只應該更新包含新數據的單元格。如果您使用CoreData,請使用NSFetchedResultsControllerDelegate方法。對於NSArray我建議KVO - 觀察陣列中已更改的對象。

+0

我猜對於UITableView的工作原理存在誤解。方法'cellForRowAtIndexPath'總是創建一個新的單元格(可能重複使用一個循環的單元格)。它永遠不會返回現有的表。它只被'UITableView'調用。如果您自己調用它,則會創建一個永不顯示的新表格單元格。 – Codo

+0

沒有誤解。在tableView之外調用'cellForForRowAtIndexPath'創建和顯示循環爲您提供現有單元格的引用,如果單元格已創建並顯示。我同意,如果'indexPath'在'indexPathsForVisibleRows'數組內,這需要額外的檢查。無論如何 - 如何在不重新加載行的情況下從NSFetchedResultsControllerDelegate方法(或任何其他更新方法)更新單元格的屬性? –