程圖片異步加載與緩存實(shí)戰(zhàn))
移動(dòng)開發(fā)前端【免費(fèi)下載鏈接】JASONETTE-iOS Native App over HTTP, on iOS項(xiàng)目地址https://gitcode.com/gh_mirrors/ja/JASONETTE-iOS點(diǎn)擊查看免費(fèi)下載導(dǎo)讀本文以 JASONETTE-iOS 倉(cāng)庫(kù)中隨包引入的 SDWebImage版本 3.8.1官方文檔為骨架結(jié)合倉(cāng)庫(kù)源碼中的真實(shí)調(diào)用點(diǎn)系統(tǒng)講解這套 iOS 圖片加載框架的核心能力與集成方式從UIImageViewWebCache的一行式異步加載到SDWebImageManager的下載/緩存調(diào)度再到SDImageCache的內(nèi)存與磁盤兩級(jí)緩存、SDWebImageDownloader的獨(dú)立下載器以及 CocoaPods/Carthage/手動(dòng)三種安裝路徑。讀完本文你將掌握在 iOS 應(yīng)用中安全、高效地加載并緩存網(wǎng)絡(luò)圖片的完整實(shí)戰(zhàn)方案并能看懂 JASONETTE-iOS 中所有圖片相關(guān)組件導(dǎo)航圖標(biāo)、背景圖、列表縮略圖、音頻封面等的底層實(shí)現(xiàn)。SDWebImage 是什么為 UIImageView 而生的遠(yuǎn)程圖片加載庫(kù)SDWebImage 是一個(gè) Objective-C 庫(kù)核心是給UIImageView提供一個(gè) category使其直接支持加載來(lái)自網(wǎng)絡(luò)的遠(yuǎn)程圖片同時(shí)提供一系列配套能力。官方文檔app/Pods/SDWebImage/README.md明確列出的功能包括為 Cocoa Touch 框架增加UIImageView分類集成 Web 圖片加載與緩存管理異步圖片下載器異步的內(nèi)存 磁盤兩級(jí)緩存并帶自動(dòng)緩存過期處理動(dòng)畫 GIF 支持WebP 格式支持后臺(tái)圖片解壓保證同一 URL 不會(huì)被重復(fù)下載保證無(wú)效bogusURL 不會(huì)被反復(fù)重試保證主線程永不被阻塞基于 GCD 與 ARCArm64 架構(gòu)支持。其中“同一 URL 不重復(fù)下載”與“無(wú)效 URL 不反復(fù)重試”兩個(gè)保證可以在 SDWebImageManager.m 的downloadImageWithURL:options:progress:completed:實(shí)現(xiàn)中看到框架內(nèi)部維護(hù)failedURLs集合一旦某 URL 下載失敗即被加入黑名單后續(xù)請(qǐng)求除非顯式傳入SDWebImageRetryFailed選項(xiàng)否則直接返回緩存不存在的錯(cuò)誤這就是“bogus URLs wont be retried again and again”的源碼依據(jù)。版本與系統(tǒng)兼容性README 明確指出3.8 版本需要 iOS 7 或更高版本因?yàn)槭褂昧?NSURLSession3.0 至 3.7 需要 iOS 5.1.1如需支持 iOS 5.0 以下只能回退到最后的 2.0 兼容分支。當(dāng)前倉(cāng)庫(kù)實(shí)際鎖定版本為 3.8.1見 app/Podfile 的pod SDWebImage, :git https://github.com/rs/SDWebImage.git, :tag 3.8.1以及 app/Podfile.lock 中記錄的SDWebImage (3.8.1)且 JASONETTE-iOS 的 Podfile 聲明的部署平臺(tái)為platform :ios, 8.0并啟用了use_frameworks!完全滿足 3.8 的 iOS 7 前提。SDWebImage 在 JASONETTE-iOS 中的真實(shí)落地場(chǎng)景在深入 API 之前先看這個(gè)倉(cāng)庫(kù)里 SDWebImage 的實(shí)際使用面——這是本文檔主題在當(dāng)前項(xiàng)目中最直接的印證。通過搜索SDWebImageManager、sd_setImageWithURL:等符號(hào)可以確認(rèn)以下調(diào)用點(diǎn)JasonImageComponent.m通過[SDWebImageManager sharedManager].imageDownloader拿到全局下載器為圖片請(qǐng)求動(dòng)態(tài)設(shè)置 HTTP Header來(lái)自 Jasonette 的 session 配置與 JSON 中聲明的header再調(diào)用sd_setImageWithURL:placeholderImage:completed:加載遠(yuǎn)程圖片本地file://圖片則用[UIImage sd_animatedGIFWithData:]處理動(dòng)畫 GIF。Jason.m導(dǎo)航欄左右菜單的圖片按鈕直接使用SDWebImageManager sharedManager的downloadImageWithURL:options:progress:completed:下載并在主線程回調(diào)中設(shè)置按鈕圖片。JasonAudioAction.m音頻流播放時(shí)下載封面圖生成MPMediaItemArtwork寫入鎖屏播放信息中心。JasonViewController.m、JasonLayer.m、JasonHorizontalSection.m單元格背景圖、layer 背景圖等均通過sd_setImageWithURL:異步加載。Jason.h、JasonImageComponent.h、JasonViewController.h、JasonAudioAction.h、JasonUtilAction.h、JasonHorizontalSection.h 統(tǒng)一通過#import SDWebImage/UIImageViewWebCache.h引入頭文件。由此可見SDWebImage 是 JASONETTE-iOS 所有遠(yuǎn)程圖片鏈路的統(tǒng)一底層本文后面的 API 講解也全部對(duì)應(yīng)這些真實(shí)調(diào)用。核心用法一UIImageViewWebCache 分類與 UITableView最小接入示例官方推薦的最簡(jiǎn)單用法是導(dǎo)入U(xiǎn)IImageViewWebCache.h頭文件后在tableView:cellForRowAtIndexPath:中調(diào)用sd_setImageWithURL:placeholderImage:從異步下載到緩存管理全部自動(dòng)完成#import SDWebImage/UIImageViewWebCache.h - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { static NSString *MyIdentifier MyIdentifier; UITableViewCell *cell [tableView dequeueReusableCellWithIdentifier:MyIdentifier]; if (cell nil) { cell [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:MyIdentifier] autorelease]; } // 使用 sd_setImageWithURL: 方法加載網(wǎng)絡(luò)圖片 [cell.imageView sd_setImageWithURL:[NSURL URLWithString:http://www.domain.com/path/to/image.jpg] placeholderImage:[UIImage imageNamed:placeholder.png]]; cell.textLabel.text My Text; return cell; }說明示例中的autorelease是早期 MRC 時(shí)代的寫法當(dāng)前倉(cāng)庫(kù)所有代碼均運(yùn)行在 ARC 環(huán)境下實(shí)際工程中直接創(chuàng)建 cell 即可無(wú)需手動(dòng)管理內(nèi)存。完整方法族UIImageViewWebCache.h 中定義了從簡(jiǎn)到繁的一整套方法可按需選擇方法說明sd_imageURL獲取當(dāng)前 imageView 正在加載/已加載的圖片 URLsd_setImageWithURL:最簡(jiǎn)形式僅指定 URL異步下載并緩存sd_setImageWithURL:placeholderImage:指定占位圖下載完成前顯示sd_setImageWithURL:placeholderImage:options:追加SDWebImageOptions行為選項(xiàng)sd_setImageWithURL:completed:帶完成回調(diào)SDWebImageCompletionBlocksd_setImageWithURL:placeholderImage:completed:占位圖 完成回調(diào)sd_setImageWithURL:placeholderImage:options:completed:選項(xiàng) 完成回調(diào)sd_setImageWithURL:placeholderImage:options:progress:completed:完整形態(tài)進(jìn)度回調(diào) 完成回調(diào)sd_setImageWithPreviousCachedImageWithURL:...優(yōu)先展示上一次緩存圖片同時(shí)嘗試刷新sd_setAnimationImagesWithURLs:用一組 URL 做幀動(dòng)畫循環(huán)sd_cancelCurrentImageLoad取消當(dāng)前下載setShowActivityIndicatorView:/setIndicatorStyle:加載時(shí)顯示系統(tǒng)菊花指示器其中完成回調(diào)SDWebImageCompletionBlock的簽名為(UIImage *image, NSError *error, SDImageCacheType cacheType, NSURL *imageURL)——第三個(gè)參數(shù)cacheType用于判斷圖片來(lái)自網(wǎng)絡(luò)SDImageCacheTypeNone、磁盤緩存SDImageCacheTypeDisk還是內(nèi)存緩存SDImageCacheTypeMemory枚舉定義見 SDImageCache.h。注意如果圖片請(qǐng)求在完成前被取消例如 cell 復(fù)用導(dǎo)致舊請(qǐng)求被新請(qǐng)求取代成功與失敗回調(diào)都不會(huì)被調(diào)用——這是官方文檔明確說明的行為也是 UITableView 快速滾動(dòng)時(shí)避免錯(cuò)亂的關(guān)鍵保證。核心用法二使用 blocks 感知進(jìn)度與結(jié)果在下載進(jìn)度與最終結(jié)果都需要感知的場(chǎng)景下使用帶 block 的重載方法。進(jìn)度回調(diào)會(huì)在下載過程中反復(fù)觸發(fā)攜帶receivedSize與expectedSize完成回調(diào)則在成功或失敗時(shí)各觸發(fā)一次[cell.imageView sd_setImageWithURL:[NSURL URLWithString:http://www.domain.com/path/to/image.jpg] placeholderImage:[UIImage imageNamed:placeholder.png] completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType, NSURL *imageURL) { // ... 完成后的處理代碼 }];該模式在 JASONETTE-iOS 中也被反復(fù)使用。以 JasonImageComponent.m 為例完成回調(diào)中把下載圖片的實(shí)際尺寸寫入JasonComponentFactory.imageLoaded供后續(xù)按比例推算高度使用若 JSON 樣式聲明了style.color還會(huì)用imageWithRenderingMode:UIImageRenderingModeAlwaysTemplate配合setTintColor:將圖片染成指定顏色。核心用法三SDWebImageManager——下載器與緩存的調(diào)度中樞直接使用 ManagerSDWebImageManager是UIImageViewWebCache分類背后的核心類負(fù)責(zé)把異步下載器SDWebImageDownloader與圖片緩存SDImageCache串聯(lián)起來(lái)SDWebImageManager.h 中的定義。在非UIView場(chǎng)景例如純 Cocoa 環(huán)境、需要手動(dòng)控制圖片用途的場(chǎng)景下可直接使用SDWebImageManager *manager [SDWebImageManager sharedManager]; [manager downloadImageWithURL:imageURL options:0 progress:^(NSInteger receivedSize, NSInteger expectedSize) { // 進(jìn)度跟蹤代碼 } completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType, BOOL finished, NSURL *imageURL) { if (image) { // 使用圖片 } }];注意 Manager 版完成回調(diào)比分類版多一個(gè)finished參數(shù)當(dāng)啟用SDWebImageProgressiveDownload漸進(jìn)式下載時(shí)finished NO的回調(diào)會(huì)攜帶半成品圖片反復(fù)觸發(fā)最后一次下載完畢才以finished YES返回完整圖片。下載流程源碼解析在 SDWebImageManager.m 中可以看到完整調(diào)度邏輯參數(shù)防御URL 傳成 NSString 會(huì)被自動(dòng)轉(zhuǎn)為 NSURL傳 NSNull 等非法對(duì)象則置為 nil防止崩潰黑名單檢查URL 為空或未指定SDWebImageRetryFailed且 URL 在failedURLs中時(shí)直接回調(diào)錯(cuò)誤不發(fā)請(qǐng)求生成緩存 keycacheKeyForURL:默認(rèn)返回url.absoluteString若設(shè)置了cacheKeyFilter則走過濾器先查緩存queryDiskCacheForKey:命中則直接回調(diào)緩存圖片未命中或帶SDWebImageRefreshCached時(shí)再發(fā)起下載把 Manager 選項(xiàng)逐位映射為SDWebImageDownloaderOptions下發(fā)給下載器。Manager 還提供cachedImageExistsForURL:/diskImageExistsForURL:同步與異步兩種版本、cacheKeyForURL:、saveImageToCache:forURL:、cancelAll、isRunning等輔助 API方便業(yè)務(wù)側(cè)自行探測(cè)緩存狀態(tài)。SDWebImageOptions 選項(xiàng)全解SDWebImageManager通過位掩碼SDWebImageOptions控制單次請(qǐng)求行為定義見 SDWebImageManager.h選項(xiàng)位行為SDWebImageRetryFailed1 0關(guān)閉 URL 黑名單允許對(duì)失敗 URL 重試SDWebImageLowPriority1 1下載延遲到 UI 交互結(jié)束后如滾動(dòng)減速期再開始SDWebImageCacheMemoryOnly1 2禁止磁盤緩存僅寫內(nèi)存緩存SDWebImageProgressiveDownload1 3漸進(jìn)式下載邊下邊顯示類似瀏覽器SDWebImageRefreshCached1 4即使命中緩存也尊重 HTTP 緩存控制頭并嘗試刷新見下文“圖片刷新”SDWebImageContinueInBackground1 5App 退后臺(tái)后繼續(xù)下載iOS 4SDWebImageHandleCookies1 6請(qǐng)求攜帶NSHTTPCookieStore中的 CookieSDWebImageAllowInvalidSSLCertificates1 7允許不受信任的 SSL 證書僅測(cè)試用SDWebImageHighPriority1 8將請(qǐng)求提到隊(duì)列最前SDWebImageDelayPlaceholder1 9延遲加載占位圖直到圖片加載完成SDWebImageTransformAnimatedImage1 10對(duì)動(dòng)畫圖也執(zhí)行變換代理方法SDWebImageAvoidAutoSetImage1 11不自動(dòng)設(shè)置到 imageView交由業(yè)務(wù)在回調(diào)中手動(dòng)設(shè)置核心用法四獨(dú)立使用異步下載器 SDWebImageDownloader如果不想要緩存只使用下載部分可以脫離 Manager 直接操作單例下載器SDWebImageDownloader.hSDWebImageDownloader *downloader [SDWebImageDownloader sharedDownloader]; [downloader downloadImageWithURL:imageURL options:0 progress:^(NSInteger receivedSize, NSInteger expectedSize) { // 進(jìn)度跟蹤代碼 } completed:^(UIImage *image, NSData *data, NSError *error, BOOL finished) { if (image finished) { // 使用圖片 } }];下載器版完成回調(diào)額外返回原始NSData便于自行處理原始數(shù)據(jù)例如判斷格式。下載器的關(guān)鍵可配置屬性結(jié)合 SDWebImageDownloader.m 源碼確認(rèn)默認(rèn)值maxConcurrentDownloads最大并發(fā)下載數(shù)默認(rèn) 6downloadTimeout請(qǐng)求超時(shí)秒數(shù)默認(rèn) 15.0并通過NSURLSessionConfiguration.timeoutIntervalForRequest生效executionOrder執(zhí)行順序默認(rèn)SDWebImageDownloaderFIFOExecutionOrder先進(jìn)先出可選SDWebImageDownloaderLIFOExecutionOrder后進(jìn)先出棧式headersFilter每次下載請(qǐng)求前對(duì) Header 做統(tǒng)一改寫的 blocksetValue:forHTTPHeaderField:為所有下載請(qǐng)求追加固定 HTTP HeaderJASONETTE-iOS 正是用此 API 注入鑒權(quán)頭見 JasonImageComponent.murlCredential/username/password請(qǐng)求憑據(jù)shouldDecompressImages下載后是否后臺(tái)解壓默認(rèn) YESsetOperationClass:替換默認(rèn)的SDWebImageDownloaderOperation實(shí)現(xiàn)類。下載器還會(huì)通過SDWebImageDownloadStartNotification/SDWebImageDownloadStopNotification發(fā)出開始/停止通知并支持setSuspended:掛起隊(duì)列與cancelAllDownloads取消全部任務(wù)。核心用法五獨(dú)立使用異步緩存 SDImageCacheSDImageCache維護(hù)一塊內(nèi)存緩存和一塊可選的磁盤緩存磁盤寫入是異步的不會(huì)給 UI 增加額外延遲SDImageCache.h??蚣芴峁﹕haredImageCache單例也支持用自定義命名空間創(chuàng)建獨(dú)立實(shí)例從而隔離緩存域SDImageCache *imageCache [[SDImageCache alloc] initWithNamespace:myNamespace]; [imageCache queryDiskCacheForKey:myCacheKey done:^(UIImage *image) { // image 非 nil 表示緩存命中 }];查詢與寫入查詢用queryDiskCacheForKey:done:若返回 nil說明緩存未命中此時(shí)應(yīng)由業(yè)務(wù)方負(fù)責(zé)生成并寫入圖片。緩存 key 是應(yīng)用內(nèi)唯一的圖片標(biāo)識(shí)通常就是圖片的絕對(duì) URL。默認(rèn)情況下內(nèi)存未命中會(huì)自動(dòng)繼續(xù)查磁盤緩存若只想查內(nèi)存用imageFromMemoryCacheForKey:同步方法。寫入用storeImage:forKey:默認(rèn)同時(shí)寫入內(nèi)存與磁盤磁盤異步若只想寫內(nèi)存使用storeImage:forKey:toDisk:并將第三個(gè)參數(shù)傳負(fù)數(shù)。更精細(xì)的寫入接口storeImage:recalculateFromImage:imageData:forKey:toDisk:允許直接保存服務(wù)端原始imageData避免二次壓縮導(dǎo)致的畫質(zhì)損失與 CPU 開銷。緩存策略與自動(dòng)清理從 SDImageCache.m 的初始化實(shí)現(xiàn)可確認(rèn)以下默認(rèn)行為磁盤緩存目錄規(guī)則為com.hackemist.SDWebImageCache. 命名空間位于默認(rèn) Caches 目錄下maxCacheAge默認(rèn) 7 天kDefaultCacheMaxCacheAge 60 * 60 * 24 * 7對(duì)應(yīng) README 中“自動(dòng)緩存過期處理”的默認(rèn)值磁盤清理通過cleanDisk系列方法刪除過期文件內(nèi)存緩存基于AutoPurgeCacheNSCache 子類收到UIApplicationDidReceiveMemoryWarningNotification時(shí)自動(dòng)clearMemoryApp 進(jìn)入后臺(tái)或即將終止時(shí)自動(dòng)執(zhí)行cleanDisk背景清理shouldDecompressImages默認(rèn) YES控制下載圖片是否后臺(tái)解壓——解壓能提升渲染性能但更耗內(nèi)存若因內(nèi)存過大崩潰可關(guān)閉還有maxMemoryCost、maxMemoryCountLimit、maxCacheSize等上限參數(shù)以及addReadOnlyCachePath:支持將預(yù)置圖片目錄作為只讀緩存路徑適合內(nèi)置離線圖片包。清理類方法包括clearMemory清內(nèi)存、clearDisk/clearDiskOnCompletion:清磁盤、cleanDisk/cleanDiskWithCompletionBlock:僅清過期、getSize/getDiskCount/calculateSizeWithCompletionBlock:統(tǒng)計(jì)占用。核心用法六緩存 key 過濾器某些場(chǎng)景下圖片 URL 帶有動(dòng)態(tài)部分例如用于訪問控制的 query 參數(shù)直接用 URL 當(dāng)緩存 key 會(huì)導(dǎo)致同一張圖反復(fù)緩存、緩存命中率下降。SDWebImageManager提供cacheKeyFilterblock輸入NSURL、輸出自定義的緩存 keyNSString。以下示例在 AppDelegate 中設(shè)置過濾器在生成緩存 key 前剔除 URL 的 query-string- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { SDWebImageManager.sharedManager.cacheKeyFilter ^(NSURL *url) { url [[NSURL alloc] initWithScheme:url.scheme host:url.host path:url.path]; return [url absoluteString]; }; // 其他初始化代碼... return YES; }其生效位置在 SDWebImageManager.mcacheKeyForURL:優(yōu)先調(diào)用self.cacheKeyFilter(url)未設(shè)置時(shí)才回退為[url absoluteString]。常見問題與踩坑指南動(dòng)態(tài)圖片尺寸導(dǎo)致 UITableViewCell 變形UITableView 會(huì)以第一次設(shè)置到 cell 上的圖片尺寸來(lái)決定 cell 高度。如果遠(yuǎn)程圖片與占位圖尺寸不一致可能出現(xiàn)奇怪的拉伸/變形。官方給出的緩解思路是讓 cell 內(nèi)的圖片保持固定寬度相關(guān)文章在 README 中以外部鏈接形式給出。JASONETTE-iOS 對(duì)這類問題的處理更徹底它在 JasonImageComponent.m 中根據(jù)已加載圖片的真實(shí)寬高比在布局階段自動(dòng)補(bǔ)齊缺失的height或width從而保持 cell 尺寸穩(wěn)定。圖片刷新SDWebImageRefreshCachedSDWebImage 默認(rèn)緩存策略非常激進(jìn)忽略服務(wù)端返回的所有緩存控制頭對(duì)圖片不做時(shí)間限制地長(zhǎng)期緩存。這意味著圖片 URL 必須是靜態(tài)的指向永不變化的資源若圖片內(nèi)容發(fā)生變化URL 的對(duì)應(yīng)部分也應(yīng)同步變化。對(duì)于無(wú)法控制服務(wù)端 URL 的場(chǎng)景典型如 Facebook 頭像這類 URL 不變但內(nèi)容更新的接口使用SDWebImageRefreshCached選項(xiàng)即可——代價(jià)是輕微的性能損失但會(huì)尊重 HTTP 緩存控制頭[imageView sd_setImageWithURL:[NSURL URLWithString:https://graph.facebook.com/olivier.poitrey/picture] placeholderImage:[UIImage imageNamed:avatar-placeholder.png] options:SDWebImageRefreshCached];該選項(xiàng)的源碼行為見 SDWebImageManager.m若命中緩存會(huì)先回調(diào)一次緩存圖片再發(fā)起網(wǎng)絡(luò)刷新最后以最終圖片回調(diào)一次完成回調(diào)觸發(fā)兩次同時(shí)SDWebImageRefreshCached會(huì)被映射為下載器層的SDWebImageDownloaderUseNSURLCache讓磁盤緩存交由 NSURLCache 處理。添加加載進(jìn)度指示器README 指向了一個(gè)獨(dú)立的第三方分類UIActivityIndicator-for-SDWebImage。實(shí)際上當(dāng)前版本已內(nèi)置此能力setShowActivityIndicatorView:YES配合setIndicatorStyle:即可顯示系統(tǒng)菊花。JASONETTE-iOS 正是這樣用的JasonImageComponent.m 中設(shè)置灰色指示器。安裝方式詳解官方文檔提供了三種接入方式結(jié)合倉(cāng)庫(kù)現(xiàn)狀分別說明。方式一CocoaPods當(dāng)前倉(cāng)庫(kù)采用的方式platform :ios, 7.0時(shí)寫入platform :ios, 7.0 pod SDWebImage, ~3.8若使用 Swift需添加use_frameworks!并把平臺(tái)提升到 iOS 8platform :ios, 8.0 use_frameworks!當(dāng)前倉(cāng)庫(kù)的 app/Podfile 正是如此平臺(tái)聲明為ios, 8.0、開啟use_frameworks!并將 SDWebImage 固定為 git 倉(cāng)庫(kù)的 3.8.1 tag。若倉(cāng)庫(kù)網(wǎng)絡(luò)不可用也可以直接在 app/Pods/SDWebImage 目錄中使用已集成的 3.8.1 完整源碼。Subspecs3.8 提供三個(gè)子模塊——Core默認(rèn)含核心功能、MapKit、WebP。默認(rèn)安裝只包含Core需要 WebP 時(shí)顯式聲明pod SDWebImage/WebP對(duì)應(yīng)源碼中的條件編譯SDWebImageDownloader 僅在定義了SD_WEBP時(shí)才把Accept: image/webp,image/*;q0.8加入默認(rèn)請(qǐng)求頭見 SDWebImageDownloader.m。方式二CarthageiOS 8在 Cartfile 中聲明github rs/SDWebImage集成后Swift 導(dǎo)入方式視安裝途徑而定經(jīng) CocoaPods 安裝用import SDWebImage手動(dòng)安裝則import WebImageObjective-C 使用import WebImage;。方式三手動(dòng)集成克隆倉(cāng)庫(kù)獲取全部文件下載/解壓框架后在工程導(dǎo)航器中右鍵選擇 Add Files to Your Project選中SDWebImage.framework并勾選 Copy items into destination groups folder (if needed)在 target 的 Build Phases → Link Binary With Libraries 中添加ImageIO.framework漸進(jìn)式下載功能依賴它在 Build Settings → Other Linker Flags 中加入-ObjC若-ObjC與擴(kuò)展了可選庫(kù)的框架如 Parse、RestKit、opencv2發(fā)生編譯沖突改用-force_load SDWebImage.framework/Versions/Current/SDWebImage使用 CocoaPods 且存在上述沖突時(shí)改用-force_load $(TARGET_BUILD_DIR)/libPods.a并追加$(inherited)在需要使用的源文件中導(dǎo)入#import SDWebImage/UIImageViewWebCache.h完成上述步驟后工程即可正常編譯。官方路線圖未來(lái)的增強(qiáng)方向README 末尾列出了作者規(guī)劃的下一步改進(jìn)用 LRU 內(nèi)存緩存清理替代“收到內(nèi)存警告即整體清空”的粗暴策略。從 SDImageCache.m 可以看到3.8.1 的內(nèi)存緩存處理仍是“收到UIApplicationDidReceiveMemoryWarningNotification時(shí)調(diào)用clearMemory整體清空”因此該 Roadmap 項(xiàng)在本文檔所對(duì)應(yīng)版本中尚未落地讀者如需 LRU 語(yǔ)義可關(guān)注后續(xù)版本或自行在AutoPurgeCache之上擴(kuò)展。許可證SDWebImage 全部源碼以 MIT 許可證發(fā)布倉(cāng)庫(kù)內(nèi)對(duì)應(yīng)文件為 app/Pods/SDWebImage/LICENSE。在 JASONETTE-iOS 中使用含app/Pods/SDWebImage/SDWebImage目錄下的全部實(shí)現(xiàn)即受此許可證約束。小結(jié)SDWebImage 3.8 用三個(gè)層次清晰的組件UIImageViewWebCache分類、SDWebImageManager調(diào)度器、SDImageCacheSDWebImageDownloader基礎(chǔ)設(shè)施解決了 iOS 遠(yuǎn)程圖片加載的全部痛點(diǎn)異步不阻塞主線程、內(nèi)存/磁盤兩級(jí)緩存、URL 去重與失敗黑名單、GIF/WebP 支持、后臺(tái)解壓與自動(dòng)過期清理。在 JASONETTE-iOS 中它承擔(dān)著從列表縮略圖、導(dǎo)航菜單圖標(biāo)、頁(yè)面背景到音頻封面的一切遠(yuǎn)程圖片任務(wù)其倉(cāng)庫(kù)內(nèi)完整源碼與各 Jasonette 組件 中的調(diào)用點(diǎn)是學(xué)習(xí)這套框架最佳的本土化教材。贊分享移動(dòng)開發(fā)前端【免費(fèi)下載鏈接】JASONETTE-iOS Native App over HTTP, on iOS項(xiàng)目地址https://gitcode.com/gh_mirrors/ja/JASONETTE-iOS點(diǎn)擊查看免費(fèi)下載相關(guān)推薦JASONETTE-iOS圖片加載與緩存SDWebImage在項(xiàng)目中的最佳實(shí)踐JASONETTE iOS圖片加載與緩存SDWebImage在項(xiàng)目中的最佳實(shí)踐 想要在iOS應(yīng)用中實(shí)現(xiàn)快速、流暢的圖片加載體驗(yàn)JASONETTE iOS項(xiàng)目移動(dòng)開發(fā)前端SDWebImage 在 Delta 模擬器中的圖片加載實(shí)踐iOS 異步下載與多級(jí)緩存完全指南SDWebImage 在 Delta 模擬器中的圖片加載實(shí)踐iOS 異步下載與多級(jí)緩存完全指南 Delta 是一款面向非越獄 iOS 設(shè)備的全能經(jīng)典游戲模擬器游戲開發(fā)解決iOS圖片加載痛點(diǎn)SDWebImage多緩存系統(tǒng)設(shè)計(jì)與實(shí)戰(zhàn)指南解決iOS圖片加載痛點(diǎn)SDWebImage多緩存系統(tǒng)設(shè)計(jì)與實(shí)戰(zhàn)指南 你是否還在為APP圖片加載速度慢、內(nèi)存占用高而困擾作為iOS開發(fā)中最流行的圖片處理庫(kù)S移動(dòng)開發(fā)圖像處理上一篇使用 Lightning Fabric 加速 DCGAN 人臉生成從原始 PyTorch 到零樣板代碼的分布式訓(xùn)練遷移下一篇CANN/runtime查看Ascend RC日志創(chuàng)作聲明:本文部分內(nèi)容由AI輔助生成(AIGC),僅供參考