2

我需要在 tableView 中实现一些图像的延迟加载,并且我已经阅读了很多关于 SDWebImage 的内容,但我无法理解它是如何工作的。我希望我能在这里得到答案。

那么对于 SDWebImage,如果我滚动得非常快,比如 100 个单元/秒会发生什么?如果这些图像没有存储在内存中 - SDWebImage 会下载所有这些图像,保存并解压缩它们吗?

我可以告诉 SDWebImage 将图像保存到“库/应用程序支持”而不是将它们保存在缓存目录中吗?我只需要我的图像第一次延迟加载。

4

2 回答 2

7

我不会真正将其称为正常意义上的“延迟加载”,因为 SDWebImage 并不是决定您的图像是否延迟加载的因素。SDWebImage 在您调用其setImageWithURL:方法之一时加载图像(变体包括占位符、无占位符、完成块、进度块等)。只有在绘制/显示单元格时才调用该方法取决于您,这决定了您是否延迟加载。如果您首先创建所有单元格(不是 incellForRowAtIndexPath:或等效方法),那么您将不会延迟加载。SDWebImage 与此无关。

SDWebImage 所做的是将图像加载到后台线程中,因此在进行此下载时您不会阻塞 UI/主线程。此外,它还会对您下载的所有图像进行磁盘缓存,并且永远不会从同一 URL 重新下载图像(这既是优点也是缺点)。您可以根据时间清除缓存,我相信 master 分支也添加了对缓存磁盘限制的支持(如果您使用的是 CocoaPods,这是相关的,因为它不默认为“master”并且您赢了'没有得到这个功能——他们可能已经更新了 CocoaPods 版本/标签,你必须确认)。

现在,只是为了获得一些额外的信息——您将阅读提到 iOS NSURLCache (5.0+) 已经实现原始 HTTP 响应的磁盘缓存的文献。但是,这意味着每次从缓存中提取图像时,都必须将原始数据转换为 UIImage。另一方面,SDWebImage 会缓存 UIImage 表示,从而节省您的开销。

关于更改目标文件夹,我可以问为什么吗?SDWebImage 半永久缓存图像(取决于您的缓存设置,如果您选择设置它们)。保存的位置并不会真正影响缓存 - 您可以修改代码以将其保存在其他位置。以下是 SDImageCache.m 中您可以更改的相关部分 - 需要查看 SDWebImage 代码的其余部分以确保它不会破坏任何内容:

    // Init the disk cache
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES);
    _diskCachePath = [paths[0] stringByAppendingPathComponent:fullNamespace];

希望这会有所帮助,如果您需要更多信息,请告诉我。

更新:专门回答这个问题:

那么对于 SDWebImage,如果我滚动得非常快,比如 100 个单元/秒会发生什么?如果这些图像没有存储在内存中 - SDWebImage 会下载所有这些图像,保存并解压缩它们吗?

这些图像将被下载(并保存到磁盘缓存,因为这是默认行为)。dequeueReusableCellWithIdentifier:当您重用单元格时(假设您使用),图像数据将被扔出内存。如果您向上滚动,SDWebImage 将知道该特定 URL 是否已下载,并将使用存储在磁盘缓存中的版本。如果您滚动得太快以至于在重新使用该单元格之前无法完成下载,那么当您向上滚动时,它将再次尝试下载图像。冲洗并重复。

于 2013-07-10T15:36:22.783 回答
0

我最近用 uitableview 实现了它

你必须做三件事,它会自己处理一切

1.在您的项目中添加 SDWebImage 完整文件夹(确保在添加时选中复制复选框) 2.将此行添加到您要处理延迟加载的类的顶部 #import UIImageView+WebCache.h"。

  1. 最后在 tableviewcell 中使用这一行

[cell.imageView setImageWithURL:(NSURL *) placeholderImage:(UIImage *)]

就是这样:) 干杯伙伴。我也为这个问题搜索了很多

于 2013-07-10T15:39:34.727 回答