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

相關文章
相關標籤/搜索