美文网首页小知识iOS学习封装
iOS-清除缓存功能(封装)

iOS-清除缓存功能(封装)

作者: Mr_Bob_ | 来源:发表于2016-06-03 12:30 被阅读542次
    应用场景:

    现在众多app中都会有清楚缓存的功能,怎么能精确的计算缓存文件的大小,从而清除缓存文件呢,下面对清楚功能做了个封装,以后需要实现此功能的小伙伴,可以直接拿过去用了哦,非常方便的.

    设计思路: 可以根据SDWebImage框架的思路, 获取文件夹路径--->遍历所有文件,一个个加起来--->获取文件夹下的子路径--->利用文件管理者计算所有文件尺寸
    首先我们可封装一个工具类,这样我们用到此功能的时候就可以直接拿出来用
    • 首先在.h文件中声明我们封装的方法名:
    #import <Foundation/Foundation.h>
    @interface FileTool : NSObject
    /**
     *  获取文件夹尺寸
     *
     *  @param directoryPath 文件夹路径
     *
     *  @return 返回文件夹尺寸
     */
     + (void)getFileSize:(NSString *)directoryPath completion:(void(^)(NSInteger))completion;
    
    /**
     *  删除文件夹所有文件
     *
     *  @param directoryPath 文件夹路径
     */
     + (void)removeDirectoryPath:(NSString *)directoryPath;
    
    • 作为一名资深的程序员封装的话,别人使用错误使用的话,我们应该提供一些错误信息,也就是所谓的抛出异常(在文件.m中实现方法)
      说明:为了避免计算比较大的文件时,计算时间会很久,如果执行app跳转的话,会产生卡顿的现象,所以采用了block回调的方式
    #import "FileTool.h"
    
    @implementation FileTool
    
    + (void)removeDirectoryPath:(NSString *)directoryPath
    {
        // 获取文件管理者
        NSFileManager *mgr = [NSFileManager defaultManager];
        
        BOOL isDirectory;
        BOOL isExist = [mgr fileExistsAtPath:directoryPath isDirectory:&isDirectory];
        
        if (!isExist || !isDirectory) {
            // 抛异常
            // name:异常名称
            // reason:报错原因
            NSException *excp = [NSException exceptionWithName:@"pathError" reason:@"笨蛋 需要传入的是文件夹路径,并且路径要存在" userInfo:nil];
            [excp raise];
            
        }
        
        // 获取cache文件夹下所有文件,不包括子路径的子路径
        NSArray *subPaths = [mgr contentsOfDirectoryAtPath:directoryPath error:nil];
        
        for (NSString *subPath in subPaths) {
            // 拼接完成全路径
            NSString *filePath = [directoryPath stringByAppendingPathComponent:subPath];
            
            // 删除路径
            [mgr removeItemAtPath:filePath error:nil];
        }
    
    }
    
    // 计算缓存
    + (void)getFileSize:(NSString *)directoryPath completion:(void(^)(NSInteger))completion
    {
        
        // 获取文件管理者
        NSFileManager *mgr = [NSFileManager defaultManager];
        BOOL isDirectory;
        BOOL isExist = [mgr fileExistsAtPath:directoryPath isDirectory:&isDirectory];
        
        if (!isExist || !isDirectory) {
            // 抛异常
            // name:异常名称
            // reason:报错原因
           NSException *excp = [NSException exceptionWithName:@"pathError" reason:@"笨蛋 需要传入的是文件夹路径,并且路径要存在" userInfo:nil];
            [excp raise];
            
        }
        
        dispatch_async(dispatch_get_global_queue(0, 0), ^{
            
            // 获取文件夹下所有的子路径,包含子路径的子路径
            NSArray *subPaths = [mgr subpathsAtPath:directoryPath];
            
            NSInteger totalSize = 0;
            
            for (NSString *subPath in subPaths) {
                // 获取文件全路径
                NSString *filePath = [directoryPath stringByAppendingPathComponent:subPath];
                
                // 判断隐藏文件
                if ([filePath containsString:@".DS"]) continue;
                
                // 判断是否文件夹
                BOOL isDirectory;
                // 判断文件是否存在,并且判断是否是文件夹
                BOOL isExist = [mgr fileExistsAtPath:filePath isDirectory:&isDirectory];
                if (!isExist || isDirectory) continue;
                
                // 获取文件属性
                // attributesOfItemAtPath:只能获取文件尺寸,获取文件夹不对,
                NSDictionary *attr = [mgr attributesOfItemAtPath:filePath error:nil];
                
                // 获取文件尺寸
                NSInteger fileSize = [attr fileSize];
                
                totalSize += fileSize;
            }
            
            // 计算完成回调(为了避免计算大的文件夹,比较耗时,如果直接返回结果,控制器跳转的时候回产生卡顿,所以采用block回调的方式)
            dispatch_sync(dispatch_get_main_queue(), ^{
                if (completion) {
                    completion(totalSize);
                }
            });
            
        });
        
    }
    
    下面我们开始演示下怎么利用这个工具类
    • 在控制器的.m文件中(首先定义个宏,可以拿到Caches文件路径,然后设置个totalSize属性,来强引用这个尺寸的大小,后面会用到):
    #import "FileTool.h"
    @property (nonatomic, assign) NSInteger totalSize;
    #define CachePath [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) firstObject]
    
    • 在viewDidLoad方法中调用计算文件大小的方法
    - (void)viewDidLoad {
        [super viewDidLoad];
        
        [SVProgressHUD showWithStatus:@"正在计算缓存尺寸...."];
        
        // 获取文件夹尺寸
        // 文件夹非常小,如果我的文件非常大
        [FileTool getFileSize:CachePath completion:^(NSInteger totalSize) {
            
            _totalSize = totalSize;
            
            [self.tableView reloadData];
            
            [SVProgressHUD dismiss];
        }];
    }
    
    • 写一个处理尺寸大小的方法
    // 获取缓存尺寸字符串
    - (NSString *)sizeStr
    {
        NSInteger totalSize = _totalSize;
        NSString *sizeStr = @"清除缓存";
        // MB KB B
        if (totalSize > 1000 * 1000) {
            // MB
            CGFloat sizeF = totalSize / 1000.0 / 1000.0;
            sizeStr = [NSString stringWithFormat:@"%@(%.1fMB)",sizeStr,sizeF];
        } else if (totalSize > 1000) {
            // KB
            CGFloat sizeF = totalSize / 1000.0;
            sizeStr = [NSString stringWithFormat:@"%@(%.1fKB)",sizeStr,sizeF];
        } else if (totalSize > 0) {
            // B
            sizeStr = [NSString stringWithFormat:@"%@(%.ldB)",sizeStr,totalSize];
        }
    
        return sizeStr;
    }
    
    • 在显示缓存大小的地方显示尺寸
    - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
    {
        UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:ID];
        // 获取缓存尺寸字符串
        cell.textLabel.text = [self sizeStr];
        
        return cell;
    }
    
    • 在点击事件中处理,删除缓存功能
    - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
    {
        // 清空缓存
        // 删除文件夹里面所有文件
        [FileTool removeDirectoryPath:CachePath];
        // 删除缓存之后,文件大小显示为0
        _totalSize = 0;
        [self.tableView reloadData];
    }
    

    相关文章

      网友评论

      • 酒红色T恤:为什么我的缓存每次都是0
        Mr_Bob_:@低碳环保_好好学习 你全部拷过去,是可以的,我试过了
      • rs_风涧澈:处理尺寸的时候为什么是1000*1000 而不是1024*1024 新手求解
      • 张大普奔:写的太好了,正好用上了,感谢。
      • 语安月月鸟:我就不客气的拿去用了:smile:
      • unhangcorn:大佬 写得太好了,我幼儿园毕业的都看得懂,感恩
        Mr_Bob_:@unhangcorn :smile:

      本文标题:iOS-清除缓存功能(封装)

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