Kingfisher原始碼閱讀 一

2021-09-11 13:38:12 字數 4473 閱讀 5226

kingfisher github位址

kingfisherswift語言編寫的一款非常受歡迎的載入庫,功能和oc語言編寫的sdwebimage類似。作者貓神是我初入ios開發到現在都很崇拜的偶像。

imageview.kf.setimage(with: imageurl)

複製**

從上面的使用方法可以看出kingfisher的使用方法非常簡單,那麼裡面是怎麼實現的呢?

關鍵點: kingfisher

不知道你是否對上面使用方法中的kf好奇,我記得我第一次使用的時候,還不是這種寫法。下面來揭開它的神秘面紗:

public

final

class

kingfisher

}public

protocol

kingfishercompatible

}public

extension

kingfishercompatible

}}extension

imageview: kingfishercompatible

複製**

1.先定義了乙個不可繼承的kingfisher類,他有乙個泛型屬性base。

2.然後定義了乙個kingfishercompatible協議,定義了乙個唯讀的kf關聯型別屬性。

3.在擴充套件中實現了kingfishercompatible協議,指定關聯型別為kingfisher,這裡的self理解為協議約束,需要遵守kingfishercompatible協議的型別,例如這裡的就是image

4.imageview遵守kingfishercompatible協議。

然後就可以使用了,imageview+kingfisher.swift中:

extension

kingfisher

where

base: imageview

複製**

這裡看上去是在給kingfisher新增擴充套件,其實是給imageview,因為kingfisher中的base屬性其實就是imageview的例項物件,我們只需要在新增的方法中用base代替我們直接給uiimageview新增擴充套件中的self就行了。

但是目前這種寫法有乙個限制,那就是結構體無法使用,因為kingfisher中的self是不支援結構體的,如果結構體也想要使用這種方法,那只有單獨寫,例如string+md5.swift檔案中的:

public

struct

stringproxy

}extension

string: kingfishercompatible

}複製**

這裡和上面類似就不贅述了,我們自己的寫的工具庫或者三方也能自定義這樣的寫法來避免衝突.

關鍵點:kingfisheroptionsinfo是乙個列舉,用來配置庫中的資訊,例如後台執行緒解碼,和出現的動畫等等.

這個方法主要配置了一些資訊,例如預設和載入指示器等等.然後就將獲取的任務轉交給了kingfishermanager。 獲取成功後,根據配置的顯示動畫,獲取顯示並動畫顯示

公開分類方法

public

func

setimage

(with resource: resource?,

placeholder: placeholder? = nil,

options: kingfisheroptionsinfo? = nil,

progressblock: downloadprogressblock? = nil,

completionhandler: completionhandler? = nil)

-> retrieveimagetask

複製**

獲取:

public

func

retrieveimage

(with resource: resource,

options: kingfisheroptionsinfo?,

progressblock: downloadprogressblock?,

completionhandler: completionhandler?)

-> retrieveimagetask

複製**

關鍵點: imagecache,快取器。

關鍵點: imageprocessor,處理器。

@discardableresult

func

downloadandcacheimage

(with url: url,

forkey key: string,

retrieveimagetask: retrieveimagetask,

progressblock: downloadprogressblock?,

completionhandler: completionhandler?,

options: kingfisheroptionsinfo)

-> retrieveimagedownloadtask?

複製**

直接將任務交給了imagecache,嘗試從快取中獲取

func

trytoretrieveimagefromcache

(forkey key: string,

with url: url,

retrieveimagetask: retrieveimagetask,

progressblock: downloadprogressblock?,

completionhandler: completionhandler?,

options: kingfisheroptionsinfo)

複製**

downloadimage(with url: url,

retrieveimagetask: retrieveimagetask? = nil,

options: kingfisheroptionsinfo? = nil,

progressblock: image**********progressblock? = nil,

completionhandler: image**********completionhandler? = nil)

-> retrieveimagedownloadtask?

複製**

快取,分為記憶體快取和磁碟快取

open func

store

(_ image: image,

original: data? = nil,

forkey key: string,

processoridentifier identifier: string = "",

cacheserializer serializer: cacheserializer = defaultcacheserializer.default,

todisk: bool = true,

completionhandler: (()

-> void)? = nil)

複製**

根據配置從記憶體獲取或者從磁碟獲取獲取.

@discardableresult

open func

retrieveimage

(forkey key: string,

options: kingfisheroptionsinfo?,

completionhandler: ((image?, cachetype)

-> void)?)

-> retrieveimagedisktask?

複製**

這篇這一篇文章主要分析kingfisher工作的主要流程,細節待後續文章分享。其中還有很多枝葉操作也是很有意思的。

《原始碼閱讀》原始碼閱讀技巧,原始碼閱讀工具

檢視某個類的完整繼承關係 選中類的名稱,然後按f4 quick type hierarchy quick type hierarchy可以顯示出類的繼承結構,包括它的父類和子類 supertype hierarchy supertype hierarchy可以顯示出類的繼承和實現結構,包括它的父類和...

原始碼閱讀 Glide原始碼閱讀之with方法(一)

前言 本篇基於4.8.0版本 原始碼閱讀 glide原始碼閱讀之with方法 一 原始碼閱讀 glide原始碼閱讀之load方法 二 原始碼閱讀 glide原始碼閱讀之into方法 三 大多數情況下,我們使用glide 就一句 但是這一句 裡面蘊含著成噸的 with方法有以下幾個過載方法 publi...

原始碼閱讀 Glide原始碼閱讀之load方法(二)

原始碼閱讀 glide原始碼閱讀之load方法 二 原始碼閱讀 glide原始碼閱讀之into方法 三 首先,load方法有以下幾個過載方法 public requestbuilder load nullable bitmap bitmap public requestbuilder load nu...