美文网首页
iOS 图片加载框架-SDWebImage 解读

iOS 图片加载框架-SDWebImage 解读

作者: 黄煎鱼 | 来源:发表于2018-11-08 13:44 被阅读0次

    前言

    在 iOS 的图片加载框架中,SDWebImage 可谓是占据大半壁江山。它支持从网络中下载且缓存图片,并设置图片到对应的 UIImageView 控件或者 UIButton 控件。在项目中使用 SDWebImage 来管理图片加载相关操作可以极大地提高开发效率,让我们更加专注于业务逻辑实现。

    功能

    1.提供了一个 UIImageView 的 category(分类)用来加载网络图片并且对网络图片的缓存进行管理
    2.采用异步方式来下载网络图片
    3.异步内存+磁盘映像缓存,并且自动处理过期的缓存图片
    4.支持 GIF 动画
    5.支持 WebP 格式
    6.同一个 URL 的网络图片不会被重复下载
    7.失效的 URL 不会被无限重试
    8.耗时操作都在子线程,确保不会阻塞主线程
    9.支持图片压缩跟解码
    10....

    文件结构图

    文件结构图.png

    解读SDWebImage UML 类图 和 流程图

    说明.png
    UML图.png

    我们便于调用的类别依赖于UIView+WebCache,UIView+WebCache依赖于SDWebImageManager;
    SDWebImageManager 由 SDWebImageManagerDelegate、SDImageCache、SDWebImageDownloader 组成,聚合关系但不是强依赖;
    SDWebImageManager 依赖于 SDWebImageCombinedOperation,SDWebImageCombinedOperation实现了SDWebImageOperation的代理;
    SDImageCache 由 SDImageCacheConfig 组成,依赖 SDWebImageCodersManager;
    SDWebImageDownloader 依赖 SDWebImageDownloaderOperation、SDWebImageDownloadToken、SDWebImageCodersManager;
    SDWebImageCodersManager 由 SDWebImageWebPCoder、SDWebImageImageIOCoder、SDWebImageGIFCoder组成;
    SDWebImageCodersManager、SDWebImageGIFCoder 实现了 SDWebImageCoder 的代理,SDWebImageWebPCoder、SDWebImageImageIOCoder 实现了 SDWebImageCoder 的子类 SDWebImageProgressiveCoder 的代理;
    SDWebImageDownloaderOperation 继承于 NSOperation ,并实现了SDWebImageDownloaderOperationInterface 、SDWebImageOperation的代理;
    SDWebImagePrefetcher 由SDWebImageManager 和 SDWebImagePrefetcherDelegate 组成;
    SDWebImage 声明了 6个 Delegate。

    流程图1.png 流程图2.png

    通常我们使用 UIImageView+WebCache 里的方法来设置网络图片的;
    UIImageView+WebCache 的主要方法是调用 UIView+WebCache 里的方法;
    UIView+WebCache 负责给 UIImageView 设置图片,
    ** 通过 SDWebImageManager 加载到图片,
    ** 把得到的 image 设置给 UIImageView
    SDWebImageManager 沟通 SDImageCache 和 SDWebImageDownloader ,
    ** 首先通过 SDImageCache 查询到是否有缓存的图片;
    ** 接着如果需要下载,就通过 SDWebImageDownloader 下载图片;
    ** 然后如果需要缓存,把图片缓存给 SDImageCache ;

    如何使用

    #import <SDWebImage/UIImageView+WebCache.h>
    //常规下载
    [cell.imageView sd_setImageWithURL:[NSURL URLWithString:@"http://www.domain.com/path/to/image.jpg"] 
        placeholderImage:[UIImage imageNamed:@"placeholder.png"]];
    //获取缓存大小
    [SDImageCache sharedImageCache] getSize];
    //清理内存
    [[SDImageCache sharedImageCache] clearMemory];
    //清理磁盘空间
    [[SDImageCache sharedImageCache] clearDisk];
    

    总结

    1. 学习OC 分类
    2. 学习类库文件目录
    3. 学习缓存多种方式(内存,文件,避免失败重试,缓存文件压缩)

    探讨

    1. 如何避免缓存图片,不同步问题?
    2. 随心邮哪些地方可以加缓存(客户端/后台)
    3. 随心邮redis内存不够时,怎么处理?

    参考链接:
    1.代码解读详细的
    2.流程图清晰
    3.其他

    相关文章

      网友评论

          本文标题:iOS 图片加载框架-SDWebImage 解读

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