美文网首页iOS Developer
iOS开发之SDWebImage解析

iOS开发之SDWebImage解析

作者: 暴_暴 | 来源:发表于2016-12-28 10:00 被阅读0次
    SDWebImage下载地址:https://github.com/rs/SDWebImage

    1.SDWebImage简介

    SDWebImage能够添加网络图像和缓存管理到Cocoa Touch framework的UIImageView类别,具有异步图像下载、支持GIF动画、支持WebP格式、后台图像解压等特征,保证相同的url不会下载多次、伪造的URL不会尝试一遍又一遍的下载、主线程永远不会被阻塞等。

    2.SDWebImage体系结构

    SDWebImage类图 SDWebImage序列图

    3.UIImageView+WebCache

    图片下载

    第一个参数:图片的url
    第二个参数:占位图片缓存处理

    - (void)sd_setImageWithURL:(NSURL *)url placeholderImage:(UIImage *)placeholder
    
    图片的下载进度

    第一个参数:图片的url
    第二个参数:占位图片
    第三个参数:下载图片的选项(策略)
    第四个参数:progress进度回调
    receivedSize:已经下载的图片大小
    expectedSize:图片的总大小

    第五个参数:completed 下载完成(成功|失败)之后的回调
    image:要下载的图片,如果错误的话,那么image = nil
    error:错误信息,如果错误的话 那么这个error有值
    cacheType:缓存的类型
    imageURL:图片的url

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

    4.SDWebImageManager

    第一个参数:图片的url
    第二个参数:下载图片的选项
    第三个参数:progress进度回调
    receivedSize:已经下载的图片大小
    expectedSize:图片的总大小

    第四个参数:completed 下载完成(成功|失败)之后的回调
    image:要下载的图片,如果错误的话,那么image = nil
    error:错误信息,如果错误的话 那么这个error有值
    cacheType:缓存的类型
    imageURL:图片的url

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

    5.UIImage+GIF

    播放本地的gif

    原理解析
    (1)把用户传入的gif图片转换为二进制数据流NSData
    (2)调用系统<ImageIO/ImageIO.h>
    +(UIImage *)sd_animatedGIFWithData:(NSData *)data
    a.系统方法根据NSData创建一个图片数据源
    b.计算数据源中一共有多少帧,把每一帧数据取出放到图片数组中
    c.根据得到的数组和计算好的动画时间得到动画
    animatedImage = [UIImage animatedImageWithImages:images duration:duration];

    +(UIImage *)sd_animatedGIFNamed:(NSString *)name
    

    6.SDWebImageDownloader和UIImage+GIF

    下载gif图片

    (1)创建SDWebImageDownloader的单例对象

    +(SDWebImageDownloader *)sharedDownloader
    

    (2)SDWebImageDownloader单例对象调用下面方法下载gif
    第一个参数:图片的url
    第二个参数:下载图片的选项(策略)
    第三个参数:progress进度回调
    receivedSize:已经下载的图片大小
    expectedSize:图片的总大小

    第四个参数:completed 下载完成(成功|失败)之后的回调
    image:要下载的图片,如果错误的话,那么image = nil
    error:错误信息,如果错误的话 那么这个error有值
    cacheType:缓存的类型
    SDImageCacheTypeNone:没有使用缓存,图片是直接下载的
    SDImageCacheTypeDisk:磁盘缓存
    SDImageCacheTypeMemory:内存缓存
    imageURL:图片的url

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

    (3)在completed中调用下面方法显示gif图片

    +(UIImage *)sd_animatedGIFWithData:(NSData *)data
    

    7.SDWebImage图片加载的流程

    (1)入口 setImageWithURL:placeholderImage:options: 会先把 placeholderImage 显示,然后 SDWebImageManager 根据 URL 开始处理图片;
    (2)进入 SDWebImageManager-downloadWithURL:delegate:options:userInfo: 交给 SDImageCache 从缓存查找图片是否已经下载queryDiskCacheForKey:delegate:userInfo:;
    (3)先从内存图片缓存查找是否有图片,如果内存中已经有图片缓存, SDImageCacheDelegate 回调 imageCache:didFindImage:forKey:userInfo: 到 SDWebImageManager;
    (4)SDWebImageManagerDelegate 回调 webImageManager:didFinishWithImage: 到 UIImageView+WebCache 等前端展示图片;
    (5)如果内存缓存中没有,生成 NSInvocationOperation 添加到队列开始从硬盘查找图片是否已经缓存;
    (6)根据 URLKey 在硬盘缓存目录下尝试读取图片文件。这一步是在 NSOperation 进行的操作,所以回主线程进行结果回调 notifyDelegate:;
    (7)如果上一操作从硬盘读取到了图片,将图片添加到内存缓存中(如果空闲内存过小,会先清空内存缓存)。SDImageCacheDelegate 回调 imageCache:didFindImage:forKey:userInfo:。进而回调展示图片;
    (8)如果从硬盘缓存目录读取不到图片,说明所有缓存都不存在该图片,需要下载图片,回调 imageCache:didNotFindImageForKey:userInfo:;
    (9)共享或重新生成一个下载器 SDWebImageDownloader 开始下载图片;
    (10)图片下载由 NSURLConnection 来做,实现相关 delegate 来判断图片下载中、下载完成和下载失败;
    (11)connection:didReceiveData: 中利用 ImageIO 做了按图片下载进度加载效果;
    (12)connectionDidFinishLoading: 数据下载完成后交给 SDWebImageDecoder 做图片解码处理;
    (13)图片解码处理在一个 NSOperationQueue 完成,不会拖慢主线程 UI。如果有需要对下载的图片进行二次处理,最好也在这里完成,效率会好很多;
    (14)在主线程 notifyDelegateOnMainThreadWithInfo: 宣告解码完成,imageDecoder:didFinishDecodingImage:userInfo: 回调给 SDWebImageDownloader;
    (15)imageDownloader:didFinishWithImage: 回调给 SDWebImageManager 告知图片下载完成;
    (16)通知所有的 downloadDelegates 下载完成,回调给需要的地方展示图片;
    (17)将图片保存到 SDImageCache 中,内存缓存和硬盘缓存同时保存。写文件到硬盘也在以单独 NSInvocationOperation 完成,避免拖慢主线程;
    (18)SDImageCache 在初始化的时候会注册一些消息通知,在内存警告或退到后台的时候清理内存图片缓存,应用结束的时候清理过期图片;
    (19)SDWebImage 也提供了 UIButton+WebCache 和 MKAnnotationView+WebCache,方便使用;
    (20)SDWebImagePrefetcher 可以预先下载图片,方便后续使用。

    >######最常用的SDWebImage接口调用
    

    [self.imageView sd_setImageWithURL:[NSURL URLWithString:@"url"] placeholderImage:[UIImage imageNamed:@"placeholder"]];

    
    ####8.缓存的处理方式:NSCache
    >在缓存中设置指定键名对应的值
    
    

    -(void)setObject:(ObjectType)obj forKey:(KeyType)key

    >在缓存中设置指定键名对应的值,并且指定该键值对的成本,用于计算记录在缓存中的所有对象的总成本,出现内存警告或者超出缓存总成本上限的时候,缓存会开启一个回收过程,删除部分元素
    
    

    -(void)setObject:(ObjectType)obj forKey:(KeyType)key cost:(NSUInteger)g

    >删除缓存中指定键名的对象
    
    

    -(void)removeObjectForKey:(KeyType)key

    >删除缓存中所有的对象
    
    

    -(void)removeAllObjects

    相关文章

      网友评论

        本文标题:iOS开发之SDWebImage解析

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