本文介紹的是如何自動清理緩存目錄。
自動清理的緩存目錄
創建一個可以自動維護容量的緩存目錄,通過 APPurgeableType
指定清空的邏輯,通過 size
指定緩存目錄的大小。應用每次啟動會在后臺進程檢查目錄狀態,并按需求刪除文件。如果一個目錄設置了容量上限,當達到上限時,會刪除其中創建時間最早的文件,使目錄恢復到 1/2 容量上限的使用情況。
#import <Foundation/Foundation.h>
typedef NS_ENUM(NSUInteger, APPurgeableType)
{
APPurgeableTypeManual = 0, // 當用戶手動清除緩存時清空
APPurgeableTypeThreeDays = 3, // 自動刪除三天前的數據
APPurgeableTypeOneWeek = 7, // 自動刪除一周前的數據
APPurgeableTypeTwoWeeks = 14, // 自動刪除兩周前的數據
APPurgeableTypeOneMonth = 30, // 自動刪除一個月前的數據
};
#ifdef __cplusplus
extern "C" {
#endif // __cplusplus
/**
* 根據用戶的輸入返回一個可被清理的存儲路徑,同時會自動判斷目錄是否存在,如果不存在會創建。
*
* @param userPath 用戶指定的路徑,比如之前使用 "Documents/SomePath" 來拼接,現在使用 APPurgeableStoragePath(@"Documents/SomePath") 獲得路徑即可。
* @param type 指定自動清空的類型,可以是用戶手動或每周,或每三天。
* @param size 指定當尺寸達到多大時,清空較老的數據,單位為 MB,0 表示不設置上限。
*
* @return 目標路徑
*/
NSString* APPurgeablePath(NSString* path);
NSString* APPurgeablePathType(NSString* path, APPurgeableType type);
NSString* APPurgeablePathTypeSize(NSString* path, APPurgeableType type, NSUInteger size /* MB */);
/**
* 清空并重置所有注冊的目錄
*/
void ResetAllPurgeablePaths();
#ifdef __cplusplus
}
#endif // __cplusplus
緩存清理接口
統一存儲提供清理緩存的實現類,這個類從 PurgeableCache.plist
中讀取清理任務,這個文件需要放在應用的 Main Bundle
里。清理器會異步執行。回調函數總會在主線程調用,可以在里面進行 UI 展示與處理。
#import <Foundation/Foundation.h>
typedef NS_ENUM(NSUInteger, APCacheCleanPhase)
{
APCacheCleanPhasePreCalculating = 0, // 執行前掃描沙箱大小
APCacheCleanPhaseCleaning, // 正在清理
APCacheCleanPhasePostCalculating, // 執行完成掃描沙箱大小
APCacheCleanPhaseDone, // 完成
};
@interface APUserCacheCleaner : NSObject
/**
* 異步執行清理。必須傳一個回調方法。
* 當 phase 返回 APCacheCleanPhasePreCalculating,APCacheCleanPhaseCleaning,APCacheCleanPhasePostCalculating 時,progress 代表真實的進度。最大為 1.0。
* 當 phase 為 APCacheCleanPhaseDone 時,progress 返回清理了多少 MB 的數據。
*
* @param callback 回調方法
*/
+ (void)execute:(void(^)(APCacheCleanPhase phase, float progress))callback;
@end
在 PurgeableCache.plist
中可以定義兩種類型的清理任務。
Path
:文件或目錄的路徑,只需要沙箱內的相對路徑即可。Entries
:當Path
為一個目錄時,刪除它下面的哪些子文件或目錄,支持*
進行通配。Class
:指定一個回調方法的定義類。Selectors
:調用Class
類的哪些類方法。注意必須為類方法,不能為實例方法。
文檔內容是否對您有幫助?