SDWebImage
SDWebImage框架的基本使用
- 以前框架没有用sd开头
用法一:分类:UIImageView+WebCache.h
- sd_setImageWithURL:placeholderImage:options:progress:completed:
- 参数一:下载图片的URL
- 参数二:占位图片
- 参数三:额外选项(),如果不需要就传0
- 枚举值
- failed下载失败尝试重新去下载,一张图片如果下载图片了会放到黑名单里,如果想要重新下载需要传入这个枚举值
- LowPriority:当scrollView滚动的时候停止下载
- CacheMemoryOnly:只做内存缓存
- ProgressiveDownload:渐进式下载
- RefreshCached:刷新缓存,非常重要,开发中常用,
- url:ww.baidu.comm/abc.png ->图片1,内存缓存|磁盘缓存
- url:www.baidu.com/bce.png->图片2,需要做刷新缓存,否则不会去下载
- continueInBackground:
- HandleCookies
- AllowInvalidsslcERTIFICATES
- HighPriority
- DelayPlaceholder
- …………
- 枚举值
- 参数四:进度回调,可以知道图片下载了百分之多少
- receivedSize:已经下载的数据大小
- expectedSize:图片的总大小
- 进度=1.0*receviedSize/expectedSize
- 参数五:completed完成之后的回调,完成不等于成功
- image:下载的图片
- error:错误信息
- cacheType:缓存类型(枚举)
- None
- Disk:磁盘缓存
- Memory:内存缓存
- imageURL:图片的url
- 如果需要监听下载进度的时候用这个方法
用法二 :SDWebImageManager
- 只是想得到图片
- 单例
- 类方法:[SDWebImageManager sharedManager]downloadImageWithURL:options:progress:completed:
- 简洁的单例模式
- 核心方法downloadImageWithURL:内部做了什么?
- 加载图片的核心方法,如果URL对应的图像在缓存中不存在,那么就下载指定的图片,否则就返回缓存的图像
- 容错处理:判断url是否争取,如果是string类型,那么尝试转化
- 初始化一个SDWebImageCombinedOperationBlock块
- 初始化设定该url是正确的isFailedURL = NO
- 加互斥锁,检索请求图片的URL是否在曾下载失败的集合中(url黑名单)
- 如果url不正确,或者选择的下载策略不是[下载失败尝试重新下载]且该url存在于黑名单中,那么直接返回,回调任务完成block块,传递错误信息
- 该宏保证了completedBlock回调在主线程中执行
- 加互斥锁,把当前的下载的任务添加到正在执行任务数组中,得到该url对应的缓存key
- queryDiskCacheForKey:done:该方法查找URLKEY对应的图片缓存是否存在,查找完毕之后,把该图片(存在|不存在)和该图片的缓存方法以block的方式传递,缓存情况查找完毕之后,在block块中进行后续的处理(如果该图片没有缓存,下载|如果缓存存在 |如果用户设置了下载缓存策略是刷新缓存如何处理等等)
用法三:播放gif图片
- 分类:UIImage+GIF
- self.imageView.image = [UIImage sd_animatedGIFNamed:@"test"];
- 不用加.gif的后缀名,内部自动就添加了
SDWebImage内部结构
- 核心方法:sd_setImageURL:placeholder:options:progress:completed:
- 图片的二进制数据
- 占位图片
- 图片下载选项
- 进度回调
- 完成回调
- 步骤:
取消当前图片下载
self sd_cancelCurrentImageLoad
利用运行时retain url
objc_setAssociatedObject(self,&imageURLKey,url,OBJC_ASSOCATTON_RETAIN_NONATOMIC);
判断,如果传入的下载策略不是延延迟显示占位图片,那么在主线程中设置展位图片
如果url不为空,检查activityView是否可用,实例化SDWebImageOperation操作
核心方法downloadImageWithURL:options:progress:completed:,移除UIActivityIndicatorView,如果图片下载完成,且传入的下载选项为手动设置图片,则直接执行completed回调,并且返回;否则,如果图片存在,则设置图片到UIImageView上面,并刷新重绘视图
- 整体结构
- Categories:分类
- UIImageView+WebCache
- 内部调用的downloadImageWithURL
- Cache:缓存处理器
- Download:图片下载处理器
- 怎么开子线程下载图片
- SDWebImageDownloaderOperation
- addOperation-->start-->main
- Manager:管理者
- Utils:公共组件
- Categories:分类
内存警告处理
-
没有使用框架
- didReeiveMemoryWarning
- 清除内存缓存removeAllObjects
- 取消队列中所有的任务cancelAllOperations
- didReeiveMemoryWarning
-
使用框架
- 很多控制器都需要用到框架下载图片,可以在appDelegate做统一处理
- applicationDidRecevieMemoryWarning:
- 清除内存中的缓存[[SDWebImageManager sharedManager].imageCache clearMemory]
- 清除磁盘缓存
- clearDisk
- cleanDisk
- 取消队列中的任务[[SDWebImageManager sharedManager] cancelAll];
SDWebImage框架实现细节
- clean/clear区别?
- imageCache属性,clear和clean是SDImageCache类的方法
- clear
- clearDiskOnCompletion:
- 开子线程异步处理清理磁盘缓存的操作
- 删除缓存文件夹
- 重新创建缓存目录
- 到主线程中处理completion回调
- clear:先把之前的缓存文件删除,然后重新创建一个新的文件(空的)
- clean
- cleanDiskOnCompletion:
- 先删除过期的缓存,接下来计算剩余缓存的大小,得到该大小之后和设定的最大缓存大小进行比较,如果超出那么就继续删除,直到小于或等于为止
-
多久算过期?过期时间是多久?
- 过期时间:默认为一周
- SDImageCache
- maxCacheAge
- initWithNameSpace:
-
该框架支持GIF图片播放:内部是怎么实现的?
-
UIImage+GIF
-
sd_animatedGIFImage:
-
sd_animatedGIFWithData:
- 创建图像源
- 获得图片帧数
- 创建空的可变的图形数组
- 遍历并且提取所有的动画帧
- animatedImageWithImages:duration:
-
注意点:创建图像源需要包含的类库ImageIO
-
-
请求超时时间:15s,只给15s的时间下载,超过15s则下载失败
-
缓存地址(路径)
- ~/Library/Caches/default/com.hackemist.SDWebImageCache.default/文件名称
-
磁盘缓存文件的名称:对URL进行MD5加密(MD5散列计算)
- echo -n "URL" |md5
-
缓存策略:默认情况下既做内存缓存又做磁盘缓存,下载图片前先检查内存缓存,再检查磁盘缓存
-
缓存的实现方式:采用了苹果推出的用来处理缓存类的NSCache
- 思考:NSCache和字典的区别是什么?
-
框架内部允许的最大并发数:6
-
对系统内存警告的处理方式:框架内部监听系统内存警告的通知,当发生后移除内存缓存中的所有对象
-
下载对列中对多个图片任务的处理方式:提供了FIFO和LIFO两种方式,默认为FIFO
-
如何下载图片?
- 采用发送NSURLSession网络请求
-
判断图片类型的方式:
- 只判断该图片二进制数据的第一个字节
- NSData的一个分类(ImageContentType)打开图片以十六进制的方式打开
- .jpeg Oxff
- .png Ox89
- .gif Ox47
网友评论