2009-06-19 85 views
2

我有一個UITableView子類和一個UITableViewCell子類,用於單元格。我預先佈置所有的單元格,並將它們存儲在我在cellForRowAtIndexPath中使用它們的數組中。除此之外,我有一個線程在後臺加載每個單元格中的一些圖像。問題在於單元格不能像載入圖像一樣快速刷新。例如,如果我不滾動我的表格視圖,則只有在所有單元格已被修改且線程已退出時纔會刷新第一個單元格。刷新UITableView

關於如何有效刷新我的tableview/cell的任何想法?

+0

這已經有了答案? – 2011-06-18 11:09:44

回答

8

您是否嘗試過在主線程上調用[cell setNeedsDisplay]?叫上一個後臺線程時

setNeedsDisplay確實幾乎什麼都沒有,

試試這個:

[cell performSelectorOnMainThread:@selector(setNeedsDisplay) withObject:nil waitUntilDone:NO]; 
+2

+1爲「主線程」。聖牛,是這讓我瘋狂! – 2011-02-10 06:38:58

0

您是否使用回調來通知控制器您的tableview圖像已經加載?否則,這將是一個理想的方法。

當圖像加載時,向表視圖控制器發出一個回調,該控制器在單元格上設置圖像,然後在tableView上調用reloadData。 這種方式每當新圖像加載時,表格將更新以顯示它。

+1

Jasarien是對的,你應該使用某種委託來回調你的ViewController,更新單元格上的圖像。然後您可以在單元上調用reloadData或setNeedsDisplay。你也應該考慮不要提前製作你的行。這會導致性能下降,並根據單元數量使用大量內存。您應該重新使用有限數量的單元格。 – Jab 2009-06-19 13:17:12

0

不確定你試圖用圖像實現什麼 - 但我可以猜測他們來自服務器,這就是爲什麼你想要在另一個線程下載它們嗎?

我不會嘗試在顯示錶格之前加載單元格 - 應儘可能使用延遲加載,以確保您充分利用設備上的內存。

我的建議是看看使用NSOperation的子類來管理圖像加載。首先,NSOperation將爲您處理線程的所有複雜性,並允許您排隊操作。然後,您將能夠確定您要完成頂部單元格的操作的優先順序。

隨着每個操作完成,您可以調用回單元格或tableViewController(可能創建一個委託協議以使其非常容易)。

如果您對每個圖像/單元格組合有操作,那麼在操作完成時應該可以刷新每個單元格。這樣做與優先考慮操作將爲您提供最佳解決方案。

如果NSOperations聽起來很複雜,或者你被這種情況拖延 - 請嘗試一下 - 它比我聽起來簡單得多。

0

您是否試過撥打[cell setNeedsDisplay]

+0

好吧,這是我在做什麼:從cellForRowAtIndexPath我發送設置需要顯示所有可見的單元格。然而,沒有差異,單元格不會更新。我開始覺得setneedsdisplay幾乎是useles ... – 2009-06-23 08:50:31