目录

目录............................................................................................................................................................................................... 1

SDWebImage........................................................................................................................................................................ 1

概要简介....................................................................................................................................................................... 1

需求分析....................................................................................................................................................................... 1

问题及解决方案..................................................................................................................................................... 2

SDWebImage介绍.............................................................................................................................................. 2

SDWebImage使用方法.................................................................................................................................. 2

SDWebImage实现的具体思想................................................................................................................ 3

1.方法的内部实现原理........................................................................................................................ 3

2.加载图片...................................................................................................................................................... 3

3.从内存或磁盘中寻找图片............................................................................................................ 4

4.从网络上获取图片.............................................................................................................................. 4

5.将获取下来的图片存储在本地做缓存.............................................................................. 5

结束语............................................................................................................................................................................. 5

附录1:主要API介绍.................................................................................................................................... 6

附录2:传入的option解释...................................................................................................................... 9


SDWebImage

 

概要简介

随着移动互联趋势的发展,手机app逐渐的成为了人们日常生活中必不可少的一份子。app内的多彩的图片使得app在用户在使用过程中目光遐迩。因此作为开发者,在为客户开发过程中,对图片的熟练运用会为app增添一份色彩。但是在开发的过程中如何更好的运用image才能让用户在使用过程中不会感觉到卡顿,图片加载不出来等问题的出现是开发者的一大问题。接下来我们介绍一下iOS开发的优秀的图片处理库SDWebImageView

需求分析

在程序开发过程中我们要站在用户的角度来考虑如何将图片做一个准确的定位。我们站在客户的角度分析一下

l  1,我想在合适的位置看到图片。

l  2,我想在多次加载同一张图片的时候紧紧耗费一张图片的流量

l  3,我不想看到在加载图片的时候app运行会出现卡顿的现象

l  4,我想看到不仅仅是固定的图片,我还想看到gif动态图

问题及解决方案

作为用户,要求的其实很简单。对于开发者来说我们也可以通过调用系统方法来实现用户的要求。但是,每个程序员都是一个独立的程序设计师,每个人的设计思想也都不苟同。对于某些开发者说(譬如我自己)写大幅篇章的代码实现了用户小小的要求,本身看上去是实现了。但是在高级工程师眼中会看到一坨坨耦合度高,思维逻辑混乱,bug层出不尽的烂代码,在用户使用的过程中很有可能出现crash的情况。在这种高频发使用的图片处理情况下,一款优秀的高内聚,低耦合,效率高第三方库应运而生,SDWebImage.

SDWebImage介绍

SDWebImage是使用最简单的方式是以UIImageView类目的方式提供下载网络图片的方法。除此之外,还可以使用它作为图片异步下载器、图片自动缓存、支持gif动态图等,它会保证相同的url图片资源只下载一次,永远不会锁住主线程,同时支持gcdarcarm64。总之,使用SDWebImage下载网络图片可以提高各种性能

  我们在通过对SDWebImage库文件的观察之后会发现,整个类库当中可以分为两个部分,以SD开头继承自NSObject的一些类,这些类起到对网络图片进行下载或者是将下载好的图片进行本地缓存的作用,我们暂且可讲这些类称之为SDWebImage的业务数据处理层。对应的,以UI开头并且是类目形式存在的类,我们可以称之为UI处理层。这个UI处理层使我们最经常用到也是最直观的类。业务数据处理层进行对下载,存储业务进行封装,从而为UI处理层服务,这是SDWebImage最主干的流程思想。当然了,我们也完全可以直接使用业务数据处理层的方法来根据需求对一些图片进行处理。详细API介绍请见附录1.

SDWebImage使用方法

1.使用cocoapods下载管理

2.下载最新的framework,导入到项目中

 

SDWebImage实现的具体思想

通常我们使用SDwebImage进行对网络图片的异步加载,在这个第三方库当中,我们使用到最多的是UIImageVIew+WebCache这个类当中的方法。经过分析可以看得出,WebCache这个类当中的方法几乎都是回归到下面这个方法当中

- (void)sd_setImageWithURL:(NSURL *)url placeholderImage:(UIImage *)placeholder options:(SDWebImageOptions)options progress:(SDWebImageDownloaderProgressBlock)progressBlock completed:(SDWebImageCompletionBlock)completedBlock;

 

这个方法本质就是对网络图片请求,请求成功则将得到的image回调出去,供我们使用。否则的话就会将error回调出去。

 

1.方法的内部实现原理

A.     首先从队列中取消正在进行的下载

B.     通过runtime方法给自己添加属性imageURLKey,并赋值(这个通过runtime底层动态添加的属性贯穿整个周期)

C.    承接代码传参关系,判断有没有选项(请查看附录2)。先将placeholder作为占位图呈现在self上

D.     如果存在url则开始对图片url进行url加载

 

2.加载图片

 

- (id <SDWebImageOperation>)downloadImageWithURL:(NSURL *)url
                                         options:(SDWebImageOptions)options
                           progress:(SDWebImageDownloaderProgressBlock)progressBlock                                            completed:(SDWebImageCompletionWithFinishedBlock)completedBlock;

 

使用SDWebImageMananger调用此方法。下载之前,需要对传进来的url进行处理,根据url在内存中寻找url对应的标示符就是之前的imageURLKey。拿到标示符之后,根据标示符查找在内存和磁盘中是否有对应的图片存在,如果对应的图片已经存在的,直接取出来图片将图片return出去。如果没有找到对应的图片,则去下载图片,完成之后将图片下载出去。有效地避免了重复进行网络请求从而造成网络资源浪费

 

3.从内存或磁盘中寻找图片

- (NSOperation *)queryDiskCacheForKey:(NSString *)key done:(SDWebImageQueryCompletedBlock)doneBlock

A.     SDImageCache提供了一个方法先从内存中找,-(UIImage*)imageFromMemoryCacheForKey:(NSString*)key。找到对应的图片则立即回调出去。

 

B.     如果没找到再拼接路径在磁盘中找。

-(UIImage *)diskImageForKey:(NSString *)key

找到的话就返回image,没有的话就返回nil

 

4.从网络上获取图片

SDWebImageDownloader 
- (id <SDWebImageOperation>)downloadImageWithURL:(NSURL *)url                                   options:(SDWebImageDownloaderOptions)options                             progress:(SDWebImageDownloaderProgressBlock)progressBlock
completed:(SDWebImageDownloaderCompletedBlock)completedBlock

 

SDWebImageDownloaderOperation
- (id)initWithRequest:(NSURLRequest *)request
              options:(SDWebImageDownloaderOptions)options
             progress:(SDWebImageDownloaderProgressBlock)progressBlock
            completed:(SDWebImageDownloaderCompletedBlock)completedBlock
            cancelled:(SDWebImageNoParamsBlock)cancelBlock

在从内存或者磁盘中找不到标识为URLKey的图片时,就根据url从网络上获取下来。

5.将获取下来的图片存储在本地做缓存

- (void)storeImage:(UIImage *)image recalculateFromImage:(BOOL)recalculate imageData:(NSData *)imageData forKey:(NSString *)key toDisk:(BOOL)toDisk

在获取下来图片之后,将图片缓存在本地磁盘当中,以便下次再从磁盘中读取图片从而不进行没必要的网络请求。

再然后就通过回调将图片展示在属于他呈现的地方


 

结束语

 

SDWebImage是一款很优秀的第三方库,高效的对网络图片进行异步请求并且存储在本地。大大的缩减了程序员在开发过程中对图片请求的代码量,同事提升了工作效率。

 

附录1:主要API介绍

 

UIImageView+WebCache

 

Ø  (void)sd_setImageWithURL:(NSURL*)url  传入一个url

Ø  (void)sd_setImageWithURL:(NSURL*)url placeholderImage:(UIImage *)placeholder 传入一个url以及占位图

Ø  (void)sd_setImageWithURL:(NSURL*)url placeholderImage:(UIImage *)placeholder options:(SDWebImageOptions)options传入一个url,占位图,以及图片选项(选项在最下方有描述)

Ø (void)sd_setImageWithURL:(NSURL*)url completed:(SDWebImageCompletionBlock)completedBlock 传进一个url,任务完成之后有block回调

Ø  (void)sd_setImageWithURL:(NSURL*)url placeholderImage:(UIImage *)placeholdercompleted:(SDWebImageCompletionBlock)completedBlock 传进一个url,和占位图,在任务完成之后有block回调

Ø (void)sd_setImageWithURL:(NSURL*)url placeholderImage:(UIImage *)placeholder options:(SDWebImageOptions)optionscompleted:(SDWebImageCompletionBlock)completedBlock传进一个url,占位图,和图片选项,在任务完成之后会有block回调

Ø  (void)sd_setImageWithURL:(NSURL*)url placeholderImage:(UIImage *)placeholderoptions:(SDWebImageOptions)options progress:(SDWebImageDownloaderProgressBlock)progressBlockcompleted:(SDWebImageCompletionBlock)completedBlock传进一个url,占位图,图片选项。在下载过程中有block回调,完成之后也有block回调

Ø  (void)sd_setImageWithPreviousCachedImageWithURL:(NSURL*)url andPlaceholderImage:(UIImage *)placeholderoptions:(SDWebImageOptions)options progress:(SDWebImageDownloaderProgressBlock)progressBlockcompleted:(SDWebImageCompletionBlock)completedBlock 传入一个rul,占位图,图片选项,在加载过程中有block回调,完成之后也有block回调(注意:在这个方法执行的过程中,sd会预先从磁盘中寻找到有没有以url为key对应的图片,如果有的话则从磁盘中读取出对应的图片当做占位图,否则会使用传入的占位图当做占位图)

Ø ( NSURL *)sd_imageURL 得到当前图片进行的url

Ø  (void)sd_cancelCurrentImageLoad 取消当前的加载

Ø  (void)sd_cancelCurrentAnimationImagesLoad取消当前的加载

Ø  (void)sd_setAnimationImagesWithURLs:(NSArray*)arrayOfURLs 这个方法用来下载一组图片,然后用来做动态图片显示

 

SDWebImageManager

这个类将异步下载器和缓存联系起来,通过这个类可以直接管理缓存和web图片下载器

 

Ø  (id<SDWebImageOperation>)downloadImageWithURL:(NSURL*)url options:(SDWebImageOptions)options progress:(SDWebImageDownloaderProgressBlock)progressBlockcompleted:(SDWebImageCompletionWithFinishedBlock)completedBlock 传入url,图片选项,有两个block回调

Ø (void)saveImageToCache:(UIImage*)image forURL:(NSURL *)url 传入url直接将此图片存入磁盘当中

Ø (void)cancelAll 取消所有操作

Ø (BOOL)isRunning 判断现在是否有操作在进行

Ø (BOOL)cachedImageExistsForURL:(NSURL*)url 根据传入的url判断当前缓存内有没有对应的图片

Ø (BOOL)diskImageExistsForURL:(NSURL*)url 根据传入的url判断当前磁盘内有没有对应的图片

Ø  (void)cachedImageExistsForURL:(NSURL*)url

completion:(SDWebImageCheckCacheCompletionBlock)completionBlock传入url判断缓存有没有存在的图片,以block的方式回调出来

Ø  (void)diskImageExistsForURL:(NSURL*)url completion:(SDWebImageCheckCacheCompletionBlock)completionBlock 传入url判断磁盘内有没有存在的对应图片,以block的方式回调出来

Ø (NSString *)cacheKeyForURL:(NSURL*)url 传入一个url,返回缓存中对应的key值

 

SDWebImageDownloader

通过这个类的单利进行独立异步下载图片

 

Ø  (id<SDWebImageOperation>)downloadImageWithURL:(NSURL *)url options:(SDWebImageDownloaderOptions)optionsprogress:(SDWebImageDownloaderProgressBlock)progressBlock completed:(SDWebImageDownloaderCompletedBlock)completedBlock传入一个url,下载选项,下载过程中在第一个block里会有回调,在下载完成之后在第二个block里会有回调

 

SDImageCache

这个类也是通过单例来调用各种实例方法。来进行对下载完成的图片进行异步缓存,或存入到磁盘,清空磁盘图片,清空缓存图片以及根据urlkey进行对现有图片的查找

 

Ø  (void)storeImage:(UIImage *)imageforKey:(NSString *)key传入一个image和对应的key,这个方法会将图片存入缓存和磁盘当中

Ø  (void)storeImage:(UIImage *)imageforKey:(NSString *)key toDisk:(BOOL)toDisk 将图片存入缓存当中,选择是否存入磁盘

Ø (UIImage*)imageFromMemoryCacheForKey:(NSString *)key 根据key值查找内存中对应的image,并返回

Ø (UIImage*)imageFromDiskCacheForKey:(NSString *)key 根据key值查找磁盘中对应的image,并返回

Ø (void)removeImageForKey:(NSString*)key  通过key找到对应的image,并且移除

Ø  (void)removeImageForKey:(NSString*)key withCompletion:(SDWebImageNoParamsBlock)completion 通过key找到对应的image,并且移除,通过block回调出去

Ø (void)removeImageForKey:(NSString*)key fromDisk:(BOOL)fromDisk 通过key找到对应的image,并移除,可选择是否删除磁盘内的

Ø - (void)removeImageForKey:(NSString*)key fromDisk:(BOOL)fromDiskwithCompletion:(SDWebImageNoParamsBlock)completion 和上面方法一样,删除完成之后通过block回调出去

Ø - (void)clearMemory 清理缓存中所有的图片

Ø - (void)clearDisk清理磁盘中所有的图片

Ø (void)cleanDiskWithCompletionBlock:(SDWebImageNoParamsBlock)completionBlock和清除磁盘中所有的图片,完成之后通过block回调

Ø (NSUInteger)getDiskCount 得到磁盘中所有image的数量

Ø  (NSUInteger)getSize 得到磁盘已用的大小

Ø  (void)calculateSizeWithCompletionBlock:(SDWebImageCalculateSizeBlock)completionBlock计算磁盘容量大小,完成之后通过block回调出去

Ø  (BOOL)diskImageExistsWithKey:(NSString*)key 根据key值判断磁盘中是否存在image

Ø  (NSString*)cachePathForKey:(NSString *)key inPath:(NSString *)path 根据key找到对应的图片,并返回其路径

 

此外,这个类当中还有一些属性可以设置图片在内存中保存的最长时间,存储图片的最大容量,以及保存在存储器当中的像素总和。这些属性SD没有做默认的值,程序员可以根据情况自己定义

Ø  @property (nonatomic, assign)NSUinteger maxCacheAge 在内存缓存保留最长时间

Ø  @property (nonatomic, assign)NSUinteger maxCacheSize 存储图片的最大容量。

Ø  @property (nonatomic, assign)NSUinteger maxMemoryCost 保存在存储器中像素的总和

 

UIImageView+HighightedWebCache

这个类是和UIImageView+WebCache类似的,只不过是高亮状态。方法几乎一样

 

UIButton+WebCache

这个是对UIButton的backgroundImage的处理,类似UIImageView的方法

 

UIImage+GIF

这个类是针对gif动态图的操作

Ø  +(UIImage *)sd_animatedGIFNamed:(NSString*)name 传入一个本地gif动态图的名称

Ø  +(UIImage*)sd_animatedGIFWithData:(NSData *)data 传入一个本地动态图的gif动态图的data

 

 

 

 

附录2:传入的option解释

SDWebImageRetryFailed 默认的,url请求失败的时候会重复尝试

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

SDWebImageCacheMemoryOnly 仅仅进行内存缓存,取消磁盘缓存

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

SDWebImageRefreshCached 刷新下载,呈现后台服务器提供的最终图像.即使这个图像已经被缓存了,但是根据HTTP相应,必要的话会刷新图片

SDWebImageContinueInBackground 即使这个程序进入后台,还是会进行下载

SDWebImageAllowInvalidSSLCertificates 允许使用无效的SSL证书

SDWebImageHighPriority 优先下载

SDWebImageDelayPlaceholder 延迟占位图片加载

SDWebImageTransformAnimatedImage 改变动画图像


Logo

瓜分20万奖金 获得内推名额 丰厚实物奖励 易参与易上手

更多推荐