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,发现里面是空的


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];
            }
        }];
上一篇 下一篇

猜你喜欢

热点阅读