2009-06-19 66 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