2023-11-28|閱讀時間 ‧ 約 4 分鐘

iOS App 圖片檔案快取機制

Sandbox 架構

app sandbox

app sandbox

/Documents:主要用於儲存用戶生成的數據或者不能重新創建的數據。這些可能包括由你的應用程式創建的文件、從服務器下載的文件、用戶在應用程式中創建或修改的數據等。

這些數據在應用程式的生命週期中是持久保存的,即使應用程式被終止或者系統重啟,這些數據也會保留。此外,如果你的應用程式啟用了 iCloud,那麼存儲在 Documents 目錄中的數據可以被自動備份到 iCloud,這樣用戶就可以在多個設備上訪問這些數據。

/Caches:此目錄用於存儲可以重新生成或下載的數據,如圖片快取、數據快取等。當設備的儲存空間不足時,系統可能會清除此目錄中的數據。然而,這種清理不是即時的,所以如果你的應用程式在後台運行,或者在一段時間內沒有被使用,這些快取數據可能仍然存在。

/tmp:此目錄用於存儲需要立即使用,但不需要長期保存的數據。當你的應用程式結束運行後,系統可能會清除此目錄中的數據。因此,你不應該在此目錄中存儲任何需要長期保存的數據。

一般來說,圖片、檔案快取應該放在/Caches裡。

SDWebImage套件快取機制

我用的SDImage,本身就有內建快取機制。

存放的地點也在/Caches資料夾裡面

~/Library/Caches/com.hackemist.SDImageCache

他允許客製化設置最大快取大小和最長快取時間。當快取大小超過這個限制,或者某個圖像的快取時間超過時間,SDWebImage 會自動清理這些圖像。

可以使用 SDImageCache 類的 config 屬性來設置這些值,例如:

SDImageCache.shared.config.maxDiskSize = 250 * 1024 * 1024 // 250 MB
SDImageCache.shared.config.maxDiskAge = 60 * 60 * 24 * 7 // 一周

預設值是一週,跟0MB。

也可以手動清理快取,使用 SDImageCache 類的 clearMemory() ,clearDisk(onCompletion:) 和 deleteOldFiles(completionBlock:) 方法。

另外SDImageCache清理的時間也是跟著UIApplication的週期,去檢查有沒有過期。

didEnterBackground

willTerminate

shouldRemoveExpiredDataWhenEnterBackground

shouldRemoveExpiredDataWhenTerminate

預設都是true

自行管理快取

由於有一些圖片、檔案是用Alamofire下載,沒辦法用SDWebImage管理。

目前我採用的方案會把圖片檔案下載後集中存在/Caches裡,做一些時間點判斷清除。因為如同上面講的/Caches雖然有可能被系統清除,但也有可能都沒清,造成App越來越大。

1. 全清空:版本更新後,使用者登出

  1. 超過一個容量大小(ex. 2GB):每次啟動時判斷,超過全清空
分享至
成為作者繼續創作的動力吧!
© 2024 vocus All rights reserved.