清除缓存的功能

作者: 追逐_chase | 来源:发表于2016-12-12 14:25 被阅读150次

    清除缓存在每一个应用是一个很常见的功能,今天这里小结一下。

    将数据永久性的存储我们称为数据持久化,其本质是将数据存储到文件中,放到本地,共手机使用。

    由于缓存文件是存在APP沙盒文件中的,所以我们要实现缓存的清除,需要通过NSFileManager的API来对缓存的清除,

    沙盒机制

    沙盒是针对安装到移动终端上的每一个APP单独生成的文件夹,存储用户的个性设置,每一个用户的内容不同,只具有读写功能

    沙盒文件夹的几个路径文件夹

    Documents文件夹

    存放数据持久化文件,比如:通讯录信息,备份时也备份该文件夹内容,该文件夹内容不能过大,否则无法上传到AppStore

    获取方法


    NSString *documentsPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) firstObject];

    NSLog(@"doo = %@",documentsPath);


    Library文件夹

    Library 包含了Documents,Preferences,tmp。

    Caches:存放缓存文件,下载的视频,图片,音频,小说都在该文件夹下

    Preferences:存放用户偏好设置,比如:存储用户的用户名和密码

    tmp:存放临时文件,比如:下载的zip包,解压之后将zip包删除,将解压内容移到Caches文件夹下.

    Caches获取方法


    NSString *cachesPath =  [NSSearchPathForDirectoriesInDomains(NSCachesDirectory,  NSUserDomainMask, YES) firstObject];

    NSLog(@"cachesPath = %@",cachesPath);


    下面的代码是可以封装成一个 tool类


    /**

    *  获取缓存路径

    *

    *  @return 缓存路径

    */

    +(NSString *)cachePath;

    /**

    *  清除缓存

    */

    +(BOOL)clearCache;

    /**

    *  获取缓存大小(单位:M)

    *

    *  @return 缓存大小

    */

    + (float)cacheSize;

    /**

    *  获取缓存大小,(以..kb/..M)形式获取

    *  小于1M,以kb形式返回,大于1M,以M形式返回

    *  @return 缓存大小+单位

    */

    +(NSString *)cacheSizeFormat;


    /**

    *  获取缓存路径

    *

    *  @return 缓存路径

    */

    +(NSString *)cachePath {

    NSString *cachesPath = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) firstObject];

    return cachesPath;

    }

    /**

    *  清除缓存

    */

    +(BOOL)clearCache {

    ///创建文件管理类

    NSFileManager *fileManager = [NSFileManager defaultManager];

    ///获取路径

    NSString *path = [self cachePath];

    BOOL result = [fileManager removeItemAtPath:path error:nil];

    [self checkDirectory:path];

    return result;

    }

    //检查路径

    +(void)checkDirectory:(NSString *)path {

    NSFileManager *fileManager = [NSFileManager defaultManager];

    BOOL isDir;

    if (![fileManager fileExistsAtPath:path isDirectory:&isDir]) {

    [self createBaseDirectoryAtPath:path];

    } else {

    if (!isDir) {

    NSError *error = nil;

    [fileManager removeItemAtPath:path error:&error];

    [self createBaseDirectoryAtPath:path];

    }

    }

    }

    + (void)createBaseDirectoryAtPath:(NSString *)path {

    __autoreleasing NSError *error = nil;

    [[NSFileManager defaultManager] createDirectoryAtPath:path withIntermediateDirectories:YES

    attributes:nil error:&error];

    if (error) {

    DebugLog(@"create cache directory failed, error = %@", error);

    } else {

    DebugLog(@"path = %@",path);

    [self addDoNotBackupAttribute:path];

    }

    }

    + (void)addDoNotBackupAttribute:(NSString *)path {

    NSURL *url = [NSURL fileURLWithPath:path];

    NSError *error = nil;

    [url setResourceValue:[NSNumber numberWithBool:YES] forKey:NSURLIsExcludedFromBackupKey error:&error];

    if (error) {

    DebugLog(@"error to set do not backup attribute, error = %@", error);

    }

    }

    /**

    *  获取缓存大小(单位:M)

    *

    *  @return 缓存大小

    */

    + (float)cacheSize {

    NSString *directoryPath = [self cachePath];

    BOOL isDir = NO;

    unsigned long long total = 0;

    if ([[NSFileManager defaultManager] fileExistsAtPath:directoryPath isDirectory:&isDir]) {

    if (isDir) {

    NSError *error = nil;

    NSArray *array = [[NSFileManager defaultManager] contentsOfDirectoryAtPath:directoryPath error:&error];

    if (error == nil) {

    for (NSString *subpath in array) {

    NSString *path = [directoryPath stringByAppendingPathComponent:subpath];

    NSDictionary *dict = [[NSFileManager defaultManager] attributesOfItemAtPath:path

    error:&error];

    if (!error) {

    total += [dict[NSFileSize] unsignedIntegerValue];

    }

    }

    }

    }

    }

    return total/(1024.0*1024.0);

    }

    /**

    *  获取缓存大小,(以..kb/..M)形式获取

    *  小于1M,以kb形式返回,大于1M,以M形式返回

    *  @return 缓存大小+单位

    */

    +(NSString *)cacheSizeFormat {

    NSString *sizeUnitString;

    float size = [self cacheSize];

    if(size < 1)

    {

    size *= 1024.0;//小于1M转化为kb

    sizeUnitString = [NSString stringWithFormat:@"%.1fkb",size];

    }

    else{

    sizeUnitString = [NSString stringWithFormat:@"%.1fM",size];

    }

    return sizeUnitString;

    }


    当然我们在APP 中有时也会加载webView,那个有时webView的缓存也要清除,我们主要清除是Cookie

    - (void)viewDidDisappear:(BOOL)animated {

       [super viewDidDisappear:animated];

    _webView = nil;

    [self cleanCacheAndCookie];

    }

    /**清除缓存和cookie*/

    - (void)cleanCacheAndCookie{

    //清除cookies

    NSHTTPCookie *cookie;

    NSHTTPCookieStorage *storage = [NSHTTPCookieStorage sharedHTTPCookieStorage];

    for (cookie in [storage cookies]){

    [storage deleteCookie:cookie];

    }

    //清除UIWebView的缓存

    [[NSURLCache sharedURLCache] removeAllCachedResponses];

    NSURLCache * cache = [NSURLCache sharedURLCache];

    [cache removeAllCachedResponses];

    [cache setDiskCapacity:0];

    [cache setMemoryCapacity:0];

    }


    相关文章

      网友评论

        本文标题:清除缓存的功能

        本文链接:https://www.haomeiwen.com/subject/stappttx.html