uitableview 中的异步图像加载

Posted

技术标签:

【中文标题】uitableview 中的异步图像加载【英文标题】:Asynchronous image loading in a uitableview 【发布时间】:2012-06-29 19:25:37 【问题描述】:

我目前正在将 Facebook 集成到我的应用程序中,并且目前正在加载登录用户的朋友的个人资料图片。我在 UITableView 中呈现这些用户,在每个单元格中显示朋友的图片和姓名。我将 UIImageView 子类化了,当在 cellForView 方法中处理相应的单元格时,图像被异步加载。

但是,当我上下滚动几次时,图像闪烁,首先加载了一些错误的图片,显示了很短的时间,然后加载了正确的图像。所以我认为我必须寻找一种方法来在单元格位于视图之外时停止加载图像。

有没有人可以帮助我解决这个问题并给我解决方案?

提前致谢!

【问题讨论】:

您能分享一些设置图像的代码吗?有比不重复使用单元更好的方法! 嘿一个建议,您可以缓存这些图像,当您完成对这些图像的处理时,清除您的缓存。 【参考方案1】:

您可以在- (void)prepareForReuse method of UITableViewCell 中关闭任何已加载的图像(以及正在进行的加载操作,如果有的话)。

我强烈建议重复使用单元格,如果没有它,您将无法获得流畅的滚动。

【讨论】:

拜托,再详细点,prepareForReuse方法中我要做什么? 您应该取消图像加载操作并清除图像视图(例如,为其分配 null 或一些占位符)。在 ios6 中你也可以使用 tableView:didEndDisplayingCell:forRowAtIndexPath: 方法。【参考方案2】:

您可以考虑不重复使用单元格。但是,如果您有很多需要加载的表格单元格(例如,很多朋友),这可能会影响性能。由于每个单元格都有自己的图像,因此不会因为单元格重复使用而发生闪烁。

要查看的另一件事是图像的文件大小。它们可能比您实际展示它们的尺寸大。如果有办法获得更小的版本,那肯定也会有所帮助。

第三,您可以将图像视图设置为tableView:willDisplayCell:forRowAtIndexPath中的默认图像。闪烁可能仍然会发生,但使用默认图像,它看起来比其他人的图片更好。事实上,我认为这就是 Facebook 应用所做的。

【讨论】:

感谢您的回复。我现在可以通过不重复使用单元格来工作:) 你真的应该重复使用单元格!【参考方案3】:

当单元格被隐藏时,它会从tableView 中删除。所以你可以在你的UITableViewCell 派生类方法中覆盖willMoveToSuperview:

- (void)willMoveToSuperview:(UIView *)newSuperview

    [super willMoveToSuperview:newSuperview];
    if(newSuperview == nil) 
        // Stop image downloading
    

【讨论】:

感谢您的回答。我试过实现这个,但效果不是很好,我遇到了和以前一样的问题;)

以上是关于uitableview 中的异步图像加载的主要内容,如果未能解决你的问题,请参考以下文章

Swift 在 UITableView 中异步加载图像 - 顶部单元格没有图片

iOS - 在 AFNetworking 异步图像下载线程完成后重新加载 UITableView

使用 RxSwift 异步加载 UITableView 单元格

关于使用沙盒与缓存进行 UITableView 异步图像下载的建议

在 UITableView 中的 iPhone 上异步加载 JSON

UITableView异步图片动态跳高