美文网首页
SDWebImage框架缓存图片有时未缓存上的问题

SDWebImage框架缓存图片有时未缓存上的问题

作者: 落叶兮兮 | 来源:发表于2020-11-13 16:55 被阅读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];
            }
        }];

相关文章

  • SDWebImage框架缓存图片有时未缓存上的问题

    今天,学习iOS开发中开屏广告的实现,目的实现在开屏时加载一张高清图片,使用的第三方框架SDWebImage(框架...

  • 解读SDWebImage

    SDWebImage是一个功能强大的图片缓存框架,可以实现网络图片加载和缓存。那么SDWebImage的缓存机制是...

  • 多线程03

    SDWebImage框架详解 下载图片并显示: 下载图片/显示图片/内存缓存/磁盘缓存 下载图片\内存缓存\磁盘缓...

  • iOS 设计模式面试题(如何设计一个图片缓存框架?)

    如何设计一个图片缓存框架? 可以模仿 SDWebImage 来实现。 构成 Manager 内存缓存 磁盘缓存 网...

  • iOS编程之缓存清除以及文件操作等

    1,SDWebImage图片缓存 这里简单讲解以下SDWebImage图片缓存大小计算以及清理缓存的方法 获取图片...

  • SDWebImage

    今天来分析SDWebImage,它是一个异步加载图片并缓存的框架,说到图片缓存,先上张图来看下图片缓存的思路 没错...

  • iOS编程常用技巧

    SDWebImage 加载大量高清图片时内存暴增 SDWebImage本地缓存有时候会害人。如果之前缓存过一张图片...

  • iOS 播放动图的第三方框架简单调研

    SDWebImage 在使用SDWebImage 作为图片加载缓存框架的时候 支持 gif 和 webp 格式的图...

  • SDWebImage缓存原理

    SDWebImage是一个功能很强大的缓存网络图片的框架。框架实现了异步加载网络图片、自动缓存图片数据等功能。以U...

  • 区分SDWebImage的三种缓存

    SDWebImage的三种缓存分为:内存图片缓存、磁盘图片缓存、内存操作缓存步骤如下1、先查看内存图片缓存,内存图...

网友评论

      本文标题:SDWebImage框架缓存图片有时未缓存上的问题

      本文链接:https://www.haomeiwen.com/subject/gqqbbktx.html