了解SDWebImage和延迟加载

时间:2013-07-10 15:11:30

标签: iphone ios lazy-loading sdwebimage

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

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

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

2 个答案:

答案 0 :(得分:7)

我不会在正常意义上将其称为“延迟加载”,因为SDWebImage并不能决定您的图像是否被懒惰加载。当您调用其中一个setImageWithURL:方法时,SDWebImage会加载图像(变体包括占位符,没有占位符,完成块,进度块等)。只有在绘制/显示单元格时才调用该方法,这就决定了您是否延迟加载。如果您首先创建所有单元格(不是cellForRowAtIndexPath:或等效方法),那么您将不会延迟加载。 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,并将使用存储在磁盘缓存中的版本。如果您滚动得太快以至于在重新使用该单元格之前无法完成下载,那么当您向上滚动时,它将再次尝试下载图像。冲洗并重复。

答案 1 :(得分:0)

我最近用uitableview

实现了它

你必须做3件事,它将自己处理所有事情

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

  1. 最后在tableviewcell中使用此行
  2. [cell.imageView setImageWithURL:(NSURL *)placeholderImage:(UIImage *)]

    多数民众赞成:)欢呼队友。我也搜索了很多这个问题