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/iphtml

  7. NSURLSessionDelegate
  8. NSURLSessionTaskDelegate
  9. NSURLSessionDataTaskDelegate
  10. NSURLSessionUploadTaskDelegate
  11. NSURLSessionDownloadTaskDelegateios

相关文章
相关标签/搜索