
Kingfisher 如何用 Base64ImageDataProvider 加載 Base64 字符串圖片【免費下載鏈接】KingfisherA lightweight, pure-Swift library for downloading and caching images from the web.項目地址: https://gitcode.com/GitHub_Trending/ki/Kingfisher當(dāng)圖片以 Base64 編碼字符串的形式存在于業(yè)務(wù)數(shù)據(jù)里比如接口返回的 base64 字段時如果你直接解碼成圖片再手動賦值給控件就會繞開 Kingfisher 的緩存與圖片處理管線。Kingfisher 提供了Base64ImageDataProvider專門用來把 Base64 字符串包裝成一個圖片數(shù)據(jù)源通過它設(shè)置的圖片其緩存、處理器等標(biāo)準(zhǔn)行為與從網(wǎng)絡(luò) URL 加載完全一致。本文以 UIKit 場景為例講清從創(chuàng)建 provider 到驗證緩存的完整路徑。準(zhǔn)備添加 Kingfisher 依賴先確認(rèn)項目已引入 Kingfisher。按倉庫 README.md 的 Installation 一節(jié)選擇 Swift Package Manager、CocoaPods 或 Pre-built Framework 三種方式之一將 Kingfisher 添加到 target然后在需要使用的文件中import Kingfisher下文示例代碼取自官方文檔 Topic_ImageDataProvider.md 的 Image from Base64 string 一節(jié)。創(chuàng)建 Base64ImageDataProviderBase64ImageDataProvider只有一個初始化方法兩個參數(shù)都必填見 ImageDataProvider.swiftbase64String圖片的 Base64 編碼字符串cacheKey用于 Kingfisher 緩存的鍵。文檔明確要求任何不同的圖片必須使用不同的 key否則不同圖片會互相覆蓋緩存。let provider Base64ImageDataProvider(base64String: \/9j\/4AAQSkZJRgABAQA..., cacheKey: some-cache-key)你傳入的cacheKey會成為 provider 的cacheKey屬性決定解碼后的圖片數(shù)據(jù)以什么鍵進(jìn)入緩存。倉庫單元測試 ImageDataProviderTests.swift 中的testBase64ImageDataProvider會先把測試圖片數(shù)據(jù)編碼為 Base64 再構(gòu)造 provider并斷言provider.cacheKey等于傳入的123可以作為參考行為。設(shè)置圖片把 provider 直接傳給imageView的setImage(with:)let provider Base64ImageDataProvider(base64String: base64String, cacheKey: some-cache-key) imageView.kf.setImage(with: provider)文檔明確說明Base64 源的所有標(biāo)準(zhǔn)功能包括緩存和圖片處理與通過 URL 獲取圖片時行為完全相同。因此可以照常附帶 options例如加一個圓角處理器示例參數(shù)與文檔中本地文件 provider 一節(jié)一致let processor RoundCornerImageProcessor(cornerRadius: 20) imageView.kf.setImage(with: provider, options: [.processor(processor)])另外ImageDataProvider擴(kuò)展提供了convertToSource()方法把 provider 轉(zhuǎn)成.provider(self)形式的Source需要以Source作為入?yún)⒌?API 可直接使用provider.convertToSource()定義見 ImageDataProvider.swift 的extension ImageDataProvider。驗證結(jié)果最直接的驗證是imageView上顯示出圖片。要確認(rèn)緩存是否真正生效可按官方文檔 CommonTasks_Cache.md 用ImageCache查詢// 是否命中緩存 let cached ImageCache.default.isCached(forKey: some-cache-key) // 緩存位于哪里.memory、.disk 或 .none let cacheType ImageCache.default.imageCachedType(forKey: some-cache-key)如果設(shè)置時附帶了處理器處理后的圖片會以不同鍵緩存操作緩存時要一并傳入處理器標(biāo)識ImageCache.default.isCached(forKey: some-cache-key, processorIdentifier: processor.identifier)也可以主動把緩存中的圖片讀出來ImageCache.default.retrieveImage(forKey: some-cache-key) { result in switch result { case .success(let value): print(value.cacheType) print(value.image) case .failure(let error): print(error) } }一個值得注意的行為細(xì)節(jié)倉庫測試testBase64ImageDataProvider在調(diào)用provider.data { ... }后立即斷言回調(diào)已被執(zhí)行且回調(diào)帶回的Data與原圖片數(shù)據(jù)相等。也就是說該 provider 是同步解碼、同步回調(diào)的不走異步加載路徑。限制與注意cacheKey沒有默認(rèn)值必須自己指定且不同圖片必須使用不同 key這是文檔明確寫出的硬性要求。從實現(xiàn)看data(handler:)內(nèi)部用Data(base64Encoded: base64String)!解碼并直接強(qiáng)制解包見 ImageDataProvider.swift 中Base64ImageDataProvider的定義。無效的 Base64 字符串會導(dǎo)致崩潰而不是通過 handler 返回.failure。如果字符串來自外部數(shù)據(jù)構(gòu)造 provider 前應(yīng)自行確認(rèn)其有效性。該 provider 只負(fù)責(zé)Base64 字符串 → 圖片數(shù)據(jù)這一步之后的解碼、處理、緩存都是 Kingfisher 標(biāo)準(zhǔn)管線這也是其行為與 URL 加載一致的原因。如果手上已經(jīng)是解碼好的Data對象可以跳過 Base64 編碼直接使用同文件中的RawImageDataProvider(data:cacheKey:)用法相同。參考Topic_ImageDataProvider.md本地數(shù)據(jù)源完整章節(jié)還包括本地文件加載、AVAsset 生成圖片以及自定義ImageDataProvider的寫法ImageDataProvider.swift協(xié)議定義與內(nèi)置 provider 實現(xiàn)ImageDataProviderTests.swiftBase64ImageDataProvider的參考行為測試【免費下載鏈接】KingfisherA lightweight, pure-Swift library for downloading and caching images from the web.項目地址: https://gitcode.com/GitHub_Trending/ki/Kingfisher創(chuàng)作聲明:本文部分內(nèi)容由AI輔助生成(AIGC),僅供參考