zoukankan      html  css  js  c++  java
  • SDWebImage 源码阅读分享

    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

  • 相关阅读:
    hdu 1540 Tunnel Warfare 线段树 单点更新,查询区间长度,区间合并
    bzoj 1798: [Ahoi2009]Seq 维护序列seq 线段树 区间乘法区间加法 区间求和
    codevs 1191 树轴染色 线段树区间定值,求和
    vijos 1659 河蟹王国 线段树区间加、区间查询最大值
    tyvj:1038 忠诚 线段树 区间查询
    KL散度
    NumPy 从已有的数组创建数组
    NumPy 创建数组
    NumPy 数组属性
    NumPy 数据类型
  • 原文地址:https://www.cnblogs.com/peaceWang/p/5884289.html
Copyright © 2011-2022 走看看