了解SDWebImage和延迟加载

Toy*_*dor 2 iphone lazy-loading ios sdwebimage

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

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

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

Jai*_*ani 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];
Run Code Online (Sandbox Code Playgroud)

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

更新:具体回答:

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

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