閱讀 Kingfisher (一) KingfisherManager

kingfisher-logo

之前在寫Objective-C的時候,都是通過使用SDWebImage來實現圖片異步下載以及緩存的。
現在的工作環境已經完全都是使用Swift了,為了工作中能夠儘量介紹OC與Swift的混合開發,就開始了解Kingfisher這個庫了。

然而在處理圖片的時候還是會思考到下面這幾個問題:

  • 進入畫面,需要下載多個產品的圖片。
  • 用戶上下滑動畫面,如何避免同時觸發同一個內容的下載。
  • 對於下載過的內容,如果進行緩存,在下次觸發下載時,可以先從緩存中讀取。
  • 對於緩存的內容是如何管理的?

於是就有了這次研究Kingfisher的動機。


Kingfisher.swift

Kingfisher同時支持macOS、watchOS、iOS以及tvOS平台

  • 他通過#if  os(macOS) 判斷系統類型
  • typealias 為一個已存在的類別取一個別名
    根據不同的系統:
    為不同系統中的變量類型建立一樣的類型名稱,比如將image對應到macOS中的NSImage以及iOS中的UIImage
    引入不同的framework,比如macOS中的AppKit以及iOS中的UIKit

之前使用SDWebImage或者使用Swift2.x版本的Kingfisher一個設定圖片的基本方法大概是這樣:

但Kingfisher在Swift3出來以後,就把調用方法給修改成類似這樣:

讓語法更Swift化。


 

kingfisher%e6%9e%b6%e6%a7%8b

從這張圖開始,接口的部分相當於對UIImageView或者

 

UIImageView+Kingfisher.swift

KingfisherManager

在這個類裡有多個工具函數,比如setImage(with URL)等等,不過最後都會調用KingfisherManager中下面這個方法:

其中Resource包含兩個屬性cacheKey以及downloadURL,其中cacheKey就是downloadURL的字符串類型,之後會被利用作為cache存儲中的key。

而這個方法中會使用到單例KingfisherManager,這個類同時管理者downloader以及cache

然後通過單例會使用到這個方法:

其中options可以對下載、緩存做一些配置上的調整。

progressBlock對應的是一個closure,用來監控下載的進度:

completionHandler是一個用來在完成任務後做處理的closure

RetrieveImageTask

KingfisherManager所調用的方法中有返回一個RetrieveImageTask

RetrieveImageTask中包括了幾個屬性

  • cancelledBeforeDownloadStarting – 用來記錄是否在下載前就呼叫了cancel方法
  • diskRetrieveTask -從Disk獲取圖片的任務
  • downloadTask – 從網路獲取圖片的任務
  • func cancel() – diskRetrieveTask以及downloadTask的取消方法

retrieveImage方法

通過判斷option是否為設定為強制刷新來調用downloadAndCacheImage或者tryToRetrieveImageFromCache。

這裡可以看到Kingfisher將下載的部分(Downloader)給獨立了出來,這樣在其他地方就可以復用了(比如從緩存中讀取,如果不存在還是要進行下載)。

發表迴響

你的電子郵件位址並不會被公開。 必要欄位標記為 *