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

  • 相关阅读:
    HDU1720 A+B Coming
    HDU1390 ZOJ1383 Binary Numbers
    HDU1390 ZOJ1383 Binary Numbers
    HDU2504 又见GCD
    HDU2504 又见GCD
    HDU1335 POJ1546 UVA389 UVALive5306 ZOJ1334 Basically Speaking
    HDU1335 POJ1546 UVA389 UVALive5306 ZOJ1334 Basically Speaking
    HDU1020 ZOJ2478 Encoding
    HDU1020 ZOJ2478 Encoding
    HDU2097 Sky数
  • 原文地址:https://www.cnblogs.com/peaceWang/p/5884289.html
Copyright © 2011-2022 走看看