SDWebImage 源码阅读分享

  1. 疑问列表

    • SDWebImage 整体框架图,主要的类包含哪些
    • SDWebImage 如何进行缓存管理,过期失效策略,缓存更新
    • SDWebImage 如何多线程处理的过程中,如何处理并发,并发数是多少,是否使用了锁机制
    • 缓存的异步处理
  2. SDWebImage 结构图

    • UIImageView+WebCache 分类扩展,方便调用
    • SDWebImageManager 统一管理
    • SDWebImageDownloader 下载缓存池
    • SDImageCache 缓存模型
      • 两层缓存模式,memory cache + disk cache
      • 先查找memory找不到会找disk, 可选方法,可以选择不找disk
      • cache使用NSURL作为key, 对于动态URL(访问控制考虑),可以使用一个将URL作为输入,生成一个NSString作为key, 通过去掉可变的部分来做到的。
      • 对于静态URL设置永不过期,可以在调用的时候手动传入更新参数
  3. SDImageCache

    • 使用NSCache来做缓存,收到memoryWarning的时候清除全部的缓存
    • 缓存时间默认是1周
    • 使用dispatch_queue_t 线性队列来做文件操作的多线程互斥管理
     dispatch_async(self.ioQueue, ^{
    NSData *data = imageData;
    ····
    [sself writeDataToDisk];
    }
    • 区分png和jpeg,png有固定的前缀头信息
    The first eight bytes of a PNG file always contain the following
    (decimal) values:// 137 80 78 71 13 10 26 10
  4. SDWebImageDownloader

    • maxConcurrentDownloads 最大并发数的控制

    • currentDownloadCount 当前正在下载的数量

    • downloadTimeout 15秒超时下载

    • executionOrder 默认先进先出下载,也可以设置后进先出下载

      • 怎么实现的:保留最后一次operation,同时给opreation设置dependency来做到后进先出的
       if (wself.executionOrder == SDWebImageDownloaderLIFOExecutionOrder) {
      // Emulate LIFO execution order by systematically adding new operations as last operation's dependency
      [wself.lastAddedOperation addDependency:operation];
      wself.lastAddedOperation = operation;
      }
    • (void)setSuspended:(BOOL)suspended; 挂起下载队列

    • (void)cancelAllDownloads; 取消下载队列中的所有下载任务

    • 使用了NSOperationQueue 来进行下载任务的并发控制,最大并发数为6 - 使用了NSURLSession进行下载

    • dispatch_queue_t barrierQueue 用并发队列来处理并发回调间的同步问题

    • 压缩图片默认开启

    • 在当前线程中栅栏执行block dispatch_barrier_sync(sself.barrierQueue, ^{ });

    • 在并发线程中栅栏执行block

      dispatch_barrier_async(sself.barrierQueue, ^{ });

    • URLCallbacks 字典保存回调

    • failedURLs 保存所有失败的请求,不在一直尝试下载,除非有声明失败后重新下载

    • 使用NSURLSession进行下载,在代理回调中组合ImageData,进行认证判断

  5. SDWebImageDownloadOperation

    • 使用了NSURLSession进行下载,delegate回调中处理出入的block
    • 使用NSNotification 发布放到主线程执行,原因参考Notification与多线程
     dispatch_async(dispatch_get_main_queue(), ^{
    [[NSNotificationCenter defaultCenter] postNotificationName:SDWebImageDownloadReceiveResponseNotification object:self];
    });
  6. NSCache 是否是线程安全的?NSFileManager是否是线程安全的?哪些对象是线程安全的

补充知识

  1. NSURLSession

  2. NSURLSessionTask

  3. NSURLSessionDataTask 兼有下载和上传,但是不如后两者细节强大

  4. NSURLSessionUploadTask 上传

  5. NSURLSessionDownloadTask 下载服务

  6. NSURLSessionStreamTask 面向tcp/ip

  7. NSURLSessionDelegate

  8. NSURLSessionTaskDelegate

  9. NSURLSessionDataTaskDelegate

  10. NSURLSessionUploadTaskDelegate

  11. NSURLSessionDownloadTaskDelegate

SDWebImage 源码阅读分享的更多相关文章

  1. 【原】SDWebImage源码阅读(五)

    [原]SDWebImage源码阅读(五) 本文转载请注明出处 —— polobymulberry-博客园 1. 前言 前面的代码并没有特意去讲SDWebImage的缓存机制,主要是想单独开一章节专门讲 ...

  2. 【原】SDWebImage源码阅读(四)

    [原]SDWebImage源码阅读(四) 本文转载请注明出处 —— polobymulberry-博客园 1. 前言 SDWebImage中主要实现了NSURLConnectionDataDelega ...

  3. 【原】SDWebImage源码阅读(三)

    [原]SDWebImage源码阅读(三) 本文转载请注明出处 —— polobymulberry-博客园 1.SDWebImageDownloader中的downloadImageWithURL 我们 ...

  4. 【原】SDWebImage源码阅读(二)

    [原]SDWebImage源码阅读(二) 本文转载请注明出处 —— polobymulberry-博客园 1. 解决上一篇遗留的坑 上一篇中对sd_setImageWithURL函数简单分析了一下,还 ...

  5. 【原】SDWebImage源码阅读(一)

    [原]SDWebImage源码阅读(一) 本文转载请注明出处 —— polobymulberry-博客园 1. 前言 一直没有系统地读过整套源码,就感觉像一直看零碎的知识点,没有系统读过一本专业经典书 ...

  6. SDWebImage源码阅读-第三篇

    这一篇讲讲不常用的一些方法. 1 sd_setImageWithPreviousCachedImageWithURL: placeholderImage: options: progress: com ...

  7. SDWebImage源码阅读-第一篇

    一 题外话 之前写过一篇最新版SDWebImage的使用,也简单的介绍了一下原理.这两天正梳理自己的知识网络,觉得有必要再阅读一下源码,一是看具体实现,二是学习一下优秀开源代码的代码风格,比如接口设计 ...

  8. SDWebImage源码阅读-第二篇

    一  SDWebImageManager的downloadImageWithURL的方法 上一篇,我们刚开了个头,分析了一下开始加载图片之前如何取消其他正在下载的任务,接着,我们回到 - (void) ...

  9. 【原】AFNetworking源码阅读(五)

    [原]AFNetworking源码阅读(五) 本文转载请注明出处 —— polobymulberry-博客园 1. 前言 上一篇中提及到了Multipart Request的构建方法- [AFHTTP ...

随机推荐

  1. [LeetCode] 306. Additive Number [Medium]

    306. Additive Number class Solution { private: string stringAddition(string &a, string &b) { ...

  2. MySQL5.6 基于db的并行复制

    slave的几个类结构:      Master_info:用于IO线程的参数,包括连接master实例的信息.      Relay_log_info:用于sql线程,表示relay log相关的信 ...

  3. 计数方法(扫描线):JLOI 2016 圆的异或并

    Description 在平面直角坐标系中给定N个圆.已知这些圆两两没有交点,即两圆的关系只存在相离和包含.求这些圆的异或面 积并.异或面积并为:当一片区域在奇数个圆内则计算其面积,当一片区域在偶数个 ...

  4. HDU 5949 Relative atomic mass 【模拟】 (2016ACM/ICPC亚洲区沈阳站)

    Relative atomic mass Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Oth ...

  5. linux下建立无线wifi------简单实用!

    一 安装必要软件安装hostapd :    sudo apt-get install hostapd安装DHCP:    sudo apt-get install dhcp3-server 二 配置 ...

  6. AutoItLibrary

    问题: [ ERROR ] Error in file 'E:\test\test_AutoItLibrary.txt': Initializing test library 'AutoItLibra ...

  7. Ubuntu安装secureCRT

    在使用secureCRT前确保主机的ssh服务是启动状态. 一.下载secureCRT包 site:  https://www.vandyke.com/download/securecrt/downl ...

  8. Android开发必知--使用View.setId的正确姿势

    这两天在写一个柱状图的自定义控件,用的直接继承ViewGroup的方式实现的,我们都知道,这是自定义控件里面最简单的一种了,有时间写个总结分享一下.这里我想说的重点是,在写这个自定义控件的时候遇到了个 ...

  9. JavaScript高级程序设计35.pdf

    遍历 “DOM2级遍历和范围”模块定义了两个用于辅助完成顺序遍历DOM结构的类型:NodeIterator和TreeWalker,两个类型能够基于给定的起点对DOM结构执行深度优先(depth-fir ...

  10. android camera(三):camera V4L2 FIMC

    1. V4L2 1)简介 在Linux中,摄像头方面的标准化程度比较高,这个标准就是V4L2驱动程序,这也是业界比较公认的方式. V4L全称是Video for Linux,是Linux内核中标准的关 ...