本文介绍的是如何自动清理缓存目录。
自动清理的缓存目录
创建一个可以自动维护容量的缓存目录,通过 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
类的哪些类方法。注意必须为类方法,不能为实例方法。
文档内容是否对您有帮助?