zoukankan      html  css  js  c++  java
  • SDWebImage 5.0简介

    一、 SDWebImage原理简介

    1.结构 (设计思路借鉴:提供多种接口,到底层调用到同一个方法,减少调用方对可选参数的传递)

    UIImageView+WebCache和UIButton+WebCache直接为表层的 UIKit框架提供接口,

    SDWebImageManger(SDWebImageManager是SDWebImage的核心类,也是我们经常接触到的类)负责处理和协调SDWebImageDownloader和SDWebImageCache, 并与UIKit层进行交互。SDWebImageDownloaderOperation真正执行下载请求;

    SDWebImageManger详解:https://www.jianshu.com/p/246f6303cb6f

    最底层的两个类为高层抽象提供支持。

    SDWebImageCompat 是最基础的配置文件,为了兼容苹果各个平台

    SDWebImageCompat 详解:https://www.jianshu.com/p/cfdd59d7df7c

    SDWebImageDecoder sd解码图片这个类其实是UIImage的一个分类UIImage+ForceDecode,主要用来解码UIImage

    SDWebImageDecoder 详解: https://www.jianshu.com/p/e631b4b2a214

    结构关系图

    结构详图(类图)

    2.原理

          一张图片加载的全过程:

    • 我们在使用SDWebImage时调用了[imageView sd_setImageWithURL:[NSURL URLWithString:@"http://www.domain.com/path/to/image.jpg"]];这个简单的分类方法,然后就静静的等着图片被设置到UIImageView类对象上。
    • 经过一系列调用,我们首先来到UIView+WebCache分类中,在这个分类中,首先保障了图片加载的唯一性,然后就开始了核心的加载操作。
    • 接着就进入了SDWebImageManager类中,在这个类中,首先去查找是否有缓存,没有缓存的话才去服务器下载。
    • 想要查找缓存我们要进入SDImageCache这个类中,在这个类中,首先去内存中查看是否有对应的缓存,如果没有再去硬盘中查找是否有对应的缓存,但是从硬盘中获取的是图片的数据,要想获得图片还要经历解码、缩放和解压。当然如果都没有缓存的话就去下载。
    • 负责下载的是SDWebImageDownloader这个类,在这个类中,将图片的下载操作封装成了自定义的一个类SDWebImageDownloaderOperation,然后添加到了操作队列中。
    • 当操作队列调用这个操作时,会调用操作对象的- (void)start方法,在重写的这个方法中,生成了任务对象dataTask,并调用resume开始执行任务。
    • 因为SDWebImageDownloaderOperation类遵守了dataTask对象的协议,所以dataTask执行的结果会通过代理方法进行回调。在代理方法中,获取并保存了服务器返回的数据,并在任务执行结束后,对数据进行解码、缩放和解压。处理完成后就进行回调。
    • 通过重重回调,要回调的数据沿着SDWebImageDownloaderOperation->SDWebImageDownloader->SDWebImageManager->UIView+WebCache一路流动,其中流动到SDWebImageManager中时对图片进行了缓存,最后在UIView+WebCache中为UIImageView设置了处理好的图片。
    • 这就是SDWebImage加载图片的大体流程,当然还有非常多的小细节和小功能,这些就在以后对具体类的阅读中学习了。

    运行时序图

    运行流程图

    3.源码解读(详解可看其中相关链接)

    详解:https://juejin.im/post/5adff5636fb9a07aa213026b

    二、SDWebImage4.0、5.0对比

    4.0源码解析 :https://juejin.im/post/5bbec080e51d450e4d3021c0 

    5.0源码解析:https://www.jianshu.com/p/8af8fc7cd5bc  

    1.项目中结构(还是一样的,不像网上资料说的 变更了结构)

    2.文件对比 5.0比4.0多出 61个文件(114+2-55)

    3.SDAnimated 4.0只是为了处理GIF 5.0可以处理动画

    4.Cache 充分体现SRP(单一职责)开发原则 ,缓存处理更加完备 专门的磁盘缓存处理类 内存缓存处理类

    SDImageCache是SDWebImage的缓存类,是SDWebImage的重要组成部分,主要提供图片的缓存,和提取,分为内存缓存和磁盘缓存两种,因为SDWebImage的接口性设计,SDImageCache完全可以单独拿出来使用

    详解:https://www.jianshu.com/p/f8f724bb0f4b

    5.Coder(图片编解码器) 方法命名少了Web 

    SDWebImage里自己写了一个编解码管理器,用于实现编码,解码,压缩,缩小图片像素功能。涉及到的文件有SDWebImageCodersManager,SDWebImageCoder,SDWebImageImageIOCoder等等

    详解 :https://www.jianshu.com/p/615d3178a508

    6.Loader 图片下载 充分体现SRP(单一职责)开发原则,区分更加明显 类的功能更加单一 ,SDWebImageError 4.0没有 5.0专门的错误处理

    SDWebImageDownloader和SDWebImageDownloaderOperation 是 SDWebImage的下载类,是SDWebImage的很重要的一个类,这个类主要负责图片的下载

    详解:https://www.jianshu.com/p/a77fd7b09bd1

    7.应用层 (多了4个文件,但跟实际使用没有多大关系)

    /**

     UIImage category for image metadata, including animation, loop count, format, incremental, etc.

     */

    用于图像元数据的ui图像类别,包括动画、循环计数、格式、增量等

    @interface UIImage (Metadata)

    /**

     Provide some commen method for `UIImage`.

     Image process is based on Core Graphics and vImage.

     */

    @interface UIImage (Transform)

    为“uiimage”提供一些通用方法,拉伸,裁剪,圆角等等。

    图像处理基于Core Graphics 和 vImage

    8.引入SDWebImageContext / SDWebImageMutableContext


    可以看到SDWebImageContext / SDWebImageMutableContext 其实就是

    以 SDWebImageContextOption为key、id(指定类型或者协议)为value 的NSDictionary/NSMutableDictionary

    typedef NSDictionary<SDWebImageContextOption, id> SDWebImageContext;

    typedef NSMutableDictionary<SDWebImageContextOption, id>SDWebImageMutableContext;

    而 SDWebImageContextOption 是一个可扩展的String枚举

    typedef NSString * SDWebImageContextOption NS_EXTENSIBLE_STRING_ENUM;

    SDWebImage定义了10个SDWebImageContextOption的key、对应的value类型和定义的位置

    Key

    Value

    Define

    SDWebImageContextSetImageOperationKey

    NSString

    SDWebImageDefine.m

    SDWebImageContextCustomManager

    SDWebImageManager

    SDWebImageDefine.m

    SDWebImageContextImageTransformer

    id<SDImageTransformer>

    SDWebImageDefine.m

    SDWebImageContextImageScaleFactor

    CGFloat

    SDWebImageDefine.m

    SDWebImageContextStoreCacheType

    SDImageCacheType

    SDWebImageDefine.m

    SDWebImageContextDownloadRequestModifier

    id<SDWebImageDownloaderRequestModifier>

    SDWebImageDefine.m

    SDWebImageContextCacheKeyFilter

    id<SDWebImageCacheKeyFilter>

    SDWebImageDefine.m

    SDWebImageContextCacheSerializer

    id<SDWebImageCacheSerializer>

    SDWebImageDefine.m

    SDWebImageContextLoaderCachedImage

    UIImage/NSImage<SDAnimatedImage>

    SDImageLoader.m

    通过图片看下SDWebImageContext有多重要

    从上图可以看到,SDWebImageContext就像一条「流水线」,把里面的参数项从最外层的View层一直传递到SDImageCache和SDWebImageDownloaderOperation。「流水线」经过的各个模块会从上去各自取自己感兴趣的东西使用(彩色实心箭头)

    详解:https://www.jianshu.com/p/cfde8db5c051

    9.协议化了很多重要的对象。(灵活)

    之前要做某个操作必须用该对象 现在任何对象都可以 只要遵守了协议就可以

    配合新引入的 SDWebImageContext/SDWebImageMutableContext 参数,保留快速使用特性的同时可以灵活的自定义高级功能

    4.4

    5.0

    SDWebImageCacheSerializerBlock

    id<SDWebImageCacheSerializer>

    SDWebImageCacheKeyFilterBlock

    id<SDWebImageCacheKeyFilter>

    SDWebImageDownloader

    id<SDImageLoader>

    SDImageCache

    id<SDImageCache>

    SDWebImageDownloaderProgressBlock

    id<SDWebImageIndicator>

    详解:https://www.jianshu.com/p/cfde8db5c051

    10.UIImage+GIF 方法变更

    备注:

    1.NS_EXTENSIBLE_STRING_ENUM 字符串类型枚举

  • 相关阅读:
    有是JSF的一个小问题,搞了我两天!从周五到周二
    MyFaces Tree2控件使用 From http://blog.163.com/net_wood/blog
    使用JSF的Selectonemenu
    SSO摘抄
    用于快速将 Web 应用程序集成到 WebSphere Portal 中的选项
    Lua 公历转农历算法
    编程语言适用场合。。。
    了解grep、vim的查找 和正则表达式
    程序员知识资产的投资
    铁道部新客票系统设计(一)
  • 原文地址:https://www.cnblogs.com/lijianyi/p/11576988.html
Copyright © 2011-2022 走看看