首页 > 其他分享 >最新版SDWebImage的使用

最新版SDWebImage的使用

时间:2023-02-07 17:32:41浏览次数:35  
标签:缓存 setImageWithURL 内存 下载 sd 使用 最新版 SDWebImage 图片

我之前写过一篇博客,介绍缓存处理的三种方式,其中最难,最麻烦,最占内存资源的还是图片缓存,最近做的项目有大量的图片处理,还是采用了SDWebImage来处理,但是发现之前封装好的代码报错了。研究发现,是我用了新版的SDWebImage,好多方法都变了。

<注:转发自cocochina,本文已是2014年12月份的原创,我研究下了下SDWebImage源代码,发现代码风格变化好多,几乎抛弃了代码协议的使用,用大多都是block回调的方式来处理事件,有兴趣的朋友可以自己查看源码,下面是原创很不错的一些总结>

现在把代码贴出来,供大家参考。尤其是新手,看完这篇博客,图片缓存so easy。最后有demo供大家下载,先学习。


第一步,下载SDWebImage,导入工程。github托管地址https://github.com/rs/SDWebImage


第二步,在需要的地方导入头文件



#import "UIImageView+WebCache.h"

       

第三步,调用sd_setImageWithURL:方法缓存图片,注意,这就是新版本的新方法,旧方法是setImageWithURL:。下面将几个方法都介绍一下。


1. sd_setImageWithURL:



     

//图片缓存的基本代码,就是这么简单

[self.image1 sd_setImageWithURL:imagePath1];

       

2. sd_setImageWithURL:  completed:



     

//用block 可以在图片加载完成之后做些事情

[self.image2 sd_setImageWithURL:imagePath2 completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType, NSURL *imageURL) {



NSLog(@
"这里可以在图片加载完成之后做些事情"
);


}];

3. sd_setImageWithURL:  placeholderImage:



   

     

//给一张默认图片,先使用默认图片,当图片加载完成后再替换

[self.image1 sd_setImageWithURL:imagePath1 placeholderImage:[UIImage imageNamed:@
"default"
]];

       

4. sd_setImageWithURL:  placeholderImage:  completed:



   

//使用默认图片,而且用block 在完成后做一些事情

[self.image1 sd_setImageWithURL:imagePath1 placeholderImage:[UIImage imageNamed:@
"default"
] completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType, NSURL *imageURL) {

NSLog(@
"图片加载完成后做的事情"
);

}];

5. sd_setImageWithURL:  placeholderImage:  options:



 

     

     

//options 选择方式

[self.image1 sd_setImageWithURL:imagePath1 placeholderImage:[UIImage imageNamed:@
"default"
] options:SDWebImageRetryFailed];

其他就不一一介绍了,oc是自文档语言,看方法名就知道干什么的了。除了带options选项的方法,其他的方法都是综合存储,也就是内存缓存和磁盘缓存结合的方式,如果你只需要内存缓存,那么在options这里选择SDWebImageCacheMemoryOnly就可以了。


如果不想深入了解,到这里你已经可以用SDWebimage进行图片缓存了,接下来我要解释options的所有选项,以及SDWebImage内部执行流程。


一、options所有选项:


//失败后重试



SDWebImageRetryFailed = 1 << 0,

//UI交互期间开始下载,导致延迟下载比如UIScrollView减速。

SDWebImageLowPriority = 1 << 1,

//只进行内存缓存

SDWebImageCacheMemoryOnly = 1 << 2,

//这个标志可以渐进式下载,显示的图像是逐步在下载


SDWebImageProgressiveDownload = 1 << 3,

//刷新缓存



SDWebImageRefreshCached = 1 << 4,

//后台下载

SDWebImageContinueInBackground = 1 << 5,

//NSMutableURLRequest.HTTPShouldHandleCookies = YES;

SDWebImageHandleCookies = 1 << 6,

//允许使用无效的SSL证书



//SDWebImageAllowInvalidSSLCertificates = 1 << 7,

//优先下载

SDWebImageHighPriority = 1 << 8,

//延迟占位符



SDWebImageDelayPlaceholder = 1 << 9,

//改变动画形象



SDWebImageTransformAnimatedImage = 1 << 10,

       

二、SDWebImage内部实现过程


入口 setImageWithURL:placeholderImage:options: 会先把 placeholderImage 显示,然后 SDWebImageManager 根据 URL 开始处理图片。


进入 SDWebImageManager-downloadWithURL:delegate:options:userInfo:,交给 SDImageCache 从缓存查找图片是否已经下载 queryDiskCacheForKey:delegate:userInfo:.


先从内存图片缓存查找是否有图片,如果内存中已经有图片缓存,SDImageCacheDelegate 回调 imageCache:didFindImage:forKey:userInfo: 到 SDWebImageManager。


SDWebImageManagerDelegate 回调 webImageManager:didFinishWithImage: 到 UIImageView+WebCache 等前端展示图片。


如果内存缓存中没有,生成 NSInvocationOperation 添加到队列开始从硬盘查找图片是否已经缓存。


根据 URLKey 在硬盘缓存目录下尝试读取图片文件。这一步是在 NSOperation 进行的操作,所以回主线程进行结果回调 notifyDelegate:。


如果上一操作从硬盘读取到了图片,将图片添加到内存缓存中(如果空闲内存过小,会先清空内存缓存)。SDImageCacheDelegate 回调 imageCache:didFindImage:forKey:userInfo:。进而回调展示图片。


如果从硬盘缓存目录读取不到图片,说明所有缓存都不存在该图片,需要下载图片,回调 imageCache:didNotFindImageForKey:userInfo:。


共享或重新生成一个下载器 SDWebImageDownloader 开始下载图片。


图片下载由 NSURLConnection 来做,实现相关 delegate 来判断图片下载中、下载完成和下载失败。


connection:didReceiveData: 中利用 ImageIO 做了按图片下载进度加载效果。


connectionDidFinishLoading: 数据下载完成后交给 SDWebImageDecoder 做图片解码处理。


图片解码处理在一个 NSOperationQueue 完成,不会拖慢主线程 UI。如果有需要对下载的图片进行二次处理,最好也在这里完成,效率会好很多。


在主线程 notifyDelegateOnMainThreadWithInfo: 宣告解码完成,imageDecoder:didFinishDecodingImage:userInfo: 回调给 SDWebImageDownloader。


imageDownloader:didFinishWithImage: 回调给 SDWebImageManager 告知图片下载完成。


通知所有的 downloadDelegates 下载完成,回调给需要的地方展示图片。


将图片保存到 SDImageCache 中,内存缓存和硬盘缓存同时保存。写文件到硬盘也在以单独 NSInvocationOperation 完成,避免拖慢主线程。


SDImageCache 在初始化的时候会注册一些消息通知,在内存警告或退到后台的时候清理内存图片缓存,应用结束的时候清理过期图片。


SDWI 也提供了 UIButton+WebCache 和 MKAnnotationView+WebCache,方便使用。


SDWebImagePrefetcher 可以预先下载图片,方便后续使用。


从上面流程可以看出,当你调用setImageWithURL:方法的时候,他会自动去给你干这么多事,当你需要在某一具体时刻做事情的时候,你可以覆盖这些方法。比如在下载某个图片的过程中要响应一个事件,就覆盖这个方法:


//覆盖方法,指哪打哪,这个方法是下载imagePath2的时候响应



SDWebImageManager *manager = [SDWebImageManager sharedManager];






[manager downloadImageWithURL:imagePath2 options:SDWebImageRetryFailed progress:^(NSInteger receivedSize, NSInteger expectedSize) {






NSLog(@
"显示当前进度"
);






} completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType, BOOL finished, NSURL *imageURL) {






NSLog(@
"下载完成"
);



}];

对于初级来说,用sd_setImageWithURL:的若干个方法就可以实现很好的图片缓存。


demo下载点这里


标签:缓存,setImageWithURL,内存,下载,sd,使用,最新版,SDWebImage,图片
From: https://blog.51cto.com/u_15952281/6042557

相关文章

  • iOS崩溃调试的使用和技巧总结
    在iOS开发调试过程中以及上线之后,程序经常会出现崩溃的问题。简单的崩溃还好说,复杂的崩溃就需要我们通过解析Crash文件来分析了,解析Crash文件在iOS开发中是比较常见的。......
  • 理论+实践,教你如何使用Nginx实现限流
    摘要:Nginx作为一款高性能的Web代理和负载均衡服务器,往往会部署在一些互联网应用比较前置的位置。此时,我们就可以在Nginx上进行设置,对访问的IP地址和并发数进行相应的限制。......
  • 二、Anaconda的使用
    #列出我本机的所有环境,第一个是自己创建的,后面的是我自己后续创建的C:\Users\yc>condainfo-e#condaenvironments:#myenv                   ......
  • 使用VMware Converter Standalone P2V(物理机转换虚拟机)
    使用VMwareConverterStandaloneP2V(物理机转换虚拟机)环境说明:1、P2V软件:VMware-converter-en-6.3.0-20575345  下载地址:vCenterConverter:P2VVirtualMachineCon......
  • 解决Centos使用ssh连接自动断开
    在使用Centos7的时候,经常在一段时间没有操作之后就自动断掉了,然后重新连接之后就可能失去了当前操作场景,那么如何才能保证我们即使长时间不操作也会一直保持连接状态,往下看......
  • 使用自定义指令fofo, 让输入框自动聚焦
    使用自定义指令fofo,让输入框自动聚焦判断指令所在的标签importVuefrom'vue'//插件对象(必须有install方法,才可以注入到Vue.use中)exportdefault{instal......
  • 苹果电脑怎么使用苹果手机的摄像头和麦克风
    1、Mac电脑和手机登陆了同一AppleID。2、Mac电脑升级到macOS13 Ventura版本。3、手机升级到iOS16版本以上。4、手机可以在设置里面打开设置-通用-隔空播放与接力-连......
  • Identity Server 4到今年年底就停止支持了,试一下使用Orchard Core 作为认证服务
    IdentityServer4到今年年底就停止支持了,新的版本需要收费(好像目前是按企业规模,不过将来说不准)。我们需要为这种情况做一些技术准备,至少需要为用户多准备一些可选方案。......
  • 游标的学习和使用
    1.游标的认识和作用1.1什么是游标?游标Cursor是处理数据的一种方法,用来查看或者处理结果集中的数据,游标提供了在结果集中一次一行或者多行向前或向后浏览数据的能力;游......
  • 使用类与对象的方式实现点击按钮让标签颜色变色
    需求使用类与对象的方式实现点击按钮让标签颜色变色结构代码......