【问题标题】:Refreshing a UITableView刷新 UITableView
【发布时间】:2009-06-19 11:17:56
【问题描述】:

我有一个用于单元格的 UITableView 子类和一个 UITableViewCell 子类。我提前构建了所有单元格并将它们存储在一个数组中,我在 cellForRowAtIndexPath 中使用它们。除此之外,我还有一个线程在后台加载每个单元格中的一些图像。问题是单元格的刷新速度不如加载图像的速度快。例如,如果我不滚动表格视图,则只有在所有单元格都已修改且线程已退出时才会刷新第一个单元格。

关于如何有效地刷新我的表格视图/单元格的任何想法?

【问题讨论】:

    标签: iphone objective-c cocoa-touch uitableview


    【解决方案1】:

    您是否尝试过在主线程上调用[cell setNeedsDisplay]

    在后台线程上调用 setNeedsDisplay 几乎什么都不做,

    试试这个:

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

    【讨论】:

    • +1 表示“在主线程上”。天哪,这让我发疯了!
    【解决方案2】:

    您是否使用回调来通知您的 tableview 的控制器图像已加载?如果没有,那将是一个理想的方法。

    当图像加载时,触发对表格视图控制器的回调,在单元格上设置图像,然后在表格视图上调用 reloadData。 这样,每当加载新图像时,表格都会更新以显示它。

    【讨论】:

    • Jasarien 是对的,您应该使用某种委托来回调您的 ViewController 以更新单元格上的图像。然后,您可以在单元格上调用 reloadData 或 setNeedsDisplay。您还应该考虑不要提前制作行。这将降低性能并根据单元的数量使用大量内存。您应该重复使用有限数量的单元格。
    【解决方案3】:

    不确定您究竟想用这些图像实现什么 - 但我可以猜测它们来自服务器,这就是为什么您想在另一个线程中下载它们?

    我不会在显示表格之前尝试加载单元格 - 您应该尽可能使用延迟加载来确保充分利用设备上的内存。

    我的建议是考虑使用 NSOperation 的子类来管理图像的加载。首先 NSOperation 将为您处理线程的所有复杂性,并允许您将操作排队。然后,您将能够为顶部的单元格确定要完成的操作的优先级。

    当每个操作完成时,您可以回调单元格或 tableViewController(也许创建一个委托协议以使这非常容易)。

    如果您对每个图像/单元格组合都有一个操作,那么您应该能够在操作完成时刷新每个单元格。这样做并确定操作的优先级将为您提供最佳解决方案。

    如果 NSOperations 听起来很复杂,或者您对此感到厌烦 - 请尝试一下 - 它比我说的要简单得多。

    【讨论】:

      【解决方案4】:

      你试过打电话给[cell setNeedsDisplay]吗?

      【讨论】:

      • 好的,这就是我正在做的事情:从 cellForRowAtIndexPath 我发送集合需要显示到所有可见的单元格。然而,没有区别,单元格没有更新。我开始觉得 setneedsdisplay 几乎没用......
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-04
      相关资源
      最近更新 更多