SDWebImage框架缓存图片有时未缓存上的问题
2020-11-13 本文已影响0人
落叶兮兮
今天,学习iOS开发中开屏广告的实现,目的实现在开屏时加载一张高清图片,使用的第三方框架SDWebImage(框架使用的是5.0)
在第一次打开时,使用SDWebImageDownloader下载图片
[[SDWebImageDownloader sharedDownloader] downloadImageWithURL:picUrl completed:^(UIImage * _Nullable image, NSData * _Nullable data, NSError * _Nullable error, BOOL finished) {
if (error) {
NSLog(@"下载图片时发生错误,错误为%@",error);
}
if (image) {
[[NSUserDefaults standardUserDefaults] setObject:@(1) forKey:@"adImage_key"];
[self showAdViewWithImage:image];
}
}];
在第二次打开时,使用代码判断,根据图片的url判断是否有缓存,如果有缓存,那么从磁盘中取出,不用再次下载
代码如下
SDWebImageManager *manager = [SDWebImageManager sharedManager];
NSString *cacheKey = [manager cacheKeyForURL:self.picUrl];
SDImageCache *cache = [SDImageCache sharedImageCache];
if (image) {
NSLog(@"缓存的图片存在,使用缓存的图片");
self.bgImageView.image = image;
}
结果,不论怎样,缓存的图片都不存在,意味着图片在第一次加载成功后并没有缓存到磁盘中
在xcode中window->Devices And Simulators中,点击download Container

下载之后,点击去library/cache,发现里面是空的

接下来,换了另外一种方法来加载图片
[self.bgImageView sd_setImageWithURL:self.picUrl completed:^(UIImage * _Nullable image, NSError * _Nullable error, SDImageCacheType cacheType, NSURL * _Nullable imageURL) {
}];
使用这种方法,使用和上面相同的测试方法,发现这种方法会在加载时将图片缓存到磁盘中,也就是downloader这个方法是不自动缓存的,后来在SDWebImage中找到了相应的解释
SDWebImage加载图片的文档
SDwebImageManager是下载和缓存的结合,使用
SDWebImageManager *manager = [SDWebImageManager sharedManager];
[manager loadImageWithURL:imageURL
options:0
progress:^(NSInteger receivedSize, NSInteger expectedSize) {
// progression tracking code
}
completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType, BOOL finished, NSURL *imageURL) {
if (image) {
// do something with image
}
}];
这种方法会自动缓存
而SDWebImageDownloader只负责下载,所以不会缓存,想要实现缓存,需要自己手动实现缓存
加上以下代码,就可以在缓存中找到
[[SDWebImageDownloader sharedDownloader] downloadImageWithURL:picUrl completed:^(UIImage * _Nullable image, NSData * _Nullable data, NSError * _Nullable error, BOOL finished) {
if (error) {
NSLog(@"下载图片时发生错误,错误为%@",error);
}
if (image) {
[[NSUserDefaults standardUserDefaults] setObject:@(1) forKey:@"adImage_key"];
//使用这种方式下载图片,必须自己写缓存到磁盘的方法,不然的话不会有缓存
//参考https://github.com/SDWebImage/SDWebImage/blob/master/Docs/HowToUse.md
[[SDImageCache sharedImageCache] storeImage:image forKey:picStr toDisk:YES completion:^{
NSLog(@"存储图片到磁盘中成功");
[self showAdViewWithImage:image];
}
}];