2014-10-01 73 views
1

我有一個應用程序可以下載某些文件。這些文件顯示在UITableView中,當點擊時,它們開始下載。UITableView reloadData阻止每秒有很多更新的UI

我想在單元格中顯示下載進度(例如,以百分比表示)。我的代碼當前更新下載進度時觸發通知。

問題是,這些進度更新每秒鐘被激發多次(幾百?次)。如果我使用[tableView reloadData],或者甚至[tableView reloadRowsAtIndexPaths:...],則下載開始後,用戶界面就會像瘋了似的,因爲這會頻繁地被調用。

除此之外,我的代碼非常少。我沒有使用任何不尋常的UITableView委託方法,並且我試圖消除除了更新cellForRowAtIndexPath:中的「下載」標籤之外的所有內容 - 但它仍然滯後很多!

我有什麼選擇?我可能會創建一個計時器,每秒更新一次UI以顯示下載進度,但這看起來很詭異。用戶界面可以更好!有沒有任何方式,我可以立即下載我的下載標籤更新沒有滯後我的用戶界面?

+0

那麼它的更多更好,刷新剛剛確切的視圖,查看進度不管它是不是個e完整的桌面視圖。在你的情況下,我會添加特定的視圖作爲你的通知的觀察者,但是你必須正確設置數據,刪除觀察者等等,同時在表格中滾動/加載新單元格 – deathhorse 2014-10-01 19:53:42

回答

1

這聽起來像你需要通知的流量減慢。

假設的進展是在0和1之間,在觸發該通知的方法中,使用類似的東西:

if (floorf(progress*100) == progress*100) { 
    // send notification 
} 

這將僅發送通知刷新小區時的進展,如果1%,2 %等

此外,在UITableView中,儘量只重裝可見單元格:

if ([[self.tableView indexPathsForVisibleRows] containsObject:indexPath]) { 
    [self.tableView reloadRowsAtIndexPath:@[ indexPath ]]; 
} 
+0

這當然是一個潛在的解決方案。但是,如果啓動了多個下載,則進度更新可能仍會每秒從多個不同的文件發送多次。即使使用reloadRowsAtIndexPaths: – ttarik 2014-10-01 20:45:01

+0

:? – Kamchatka 2014-10-01 20:48:00

+0

編輯了一些更多的幫助 – Kamchatka 2014-10-01 20:52:08

0

我會使用performSelector:withObject:afterDelay方法,它會是這個樣子

[self performSelector:@selector(updateCell:) withObject:cell afterDelay:0.5]; 

的updateCell方法會是這個樣子

- (void)updateCell:(CustomUITableViewCell *)cell { 
    [cell setNeedsLayout]; 
    if (cell && cell.downloadPercentage < 100) { 
     [self updateCell:cell]; 
    } 
} 

這是什麼東西做的是調用每1/2秒更新一次,直到下載完成。它調用[cell setNeedsLayout](或者您可以調用任何想要更新單元格顯示的方法來更新百分比欄,例如[cell setNeedsDisplay]或[cell updateDownloadLabel])來更新單元格,然後再次調用updateCell。

你可以玩得很開心,看看它,看看你想要什麼,並平衡性能。

可能有一些問題,與此獲取調用一個細胞滾動後關閉屏幕,所以一定要檢查電池仍然存在

+0

'setNeedsLayout'不會導致' cellForRowAtIndexPath'被調用,這是文本標籤更新的地方。你打算如何工作?另外,'performSelector:withObject:afterDelay:'有什麼好處直接簡單地調用函數?第一次執行'updateCell:'調用後,您的代碼也會進入無限循環。 – ttarik 2014-10-01 20:38:17

+0

將setNeedsLayout替換爲reloadRowAtIndexPath或其他想要重新加載單元格的方法。該方法的優點是你可以延遲執行它,這會提高性能,因爲你並不是經常這樣做。如果cell.downloadPercentage> = 100 – Alex 2014-10-01 20:39:58

+0

進度更新每秒發送數百次,它不會進入無限循環。它會將它們全部延遲半秒,以便在半秒鐘後,它們將再次開始每秒發送數百次。如果這是在主線程上,cell.downloadPercentage將永遠無法更新,因爲您經常調用'updateCell:' - 一個無限循環。 – ttarik 2014-10-01 20:41:56