项目中如何拿到缓存大小?

我想%99的App中应该都会有如下一栏,那就是设置中的清除缓存:

接下来就说一下常用的几种获取缓存大小操作(前提是用到了SDWebImage框架):

  • 直接使用SDWebImage框架获取缓存大小
    在SD中的SDImageCache这个类中,有个getSize方法是直接可以获取缓存大小的!
NSUInteger caches = [[SDImageCache sharedImageCache] getSize];

这种方式最简单也最便捷!但是作为学习,并不能理解具体的实现,所以接下来介绍SD的具体实现方法!

  • 利用NSFileManager这个类来算出缓存文件夹的缓存大小
    1> 首先拿到NSFileManager这个单例对象
NSFileManager *manager = [NSFileManager defaultManager];

2> 获取缓存文件夹路径

// YES代表展开~号
    NSString *caches = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) lastObject] ;
    NSString *cachePath = [caches stringByAppendingPathComponent:@"default/com.hackemist.SDWebImageCache.default"];

3> 根据缓存文件夹路径获取遍历器对象(遍历该文件夹下的所有文件)

// 文件遍历器(遍历该文件夹下的所有文件) NSDirectoryEnumerator *fileEnumerator = [manager enumeratorAtPath:cachePath];

4> 利用遍历器,开始遍历来获取每一个文件的文件名。然后根据缓存文件夹路径拼接每一个文件的全路径

5> 接着根据该全路径来获取文件的具体信息(比如文件大小,类型等)

NSDictionary *attrs = [manager attributesOfItemAtPath:filePath error:nil];

6> 然后就需要判断该全路径对应的是文件还是文件夹了(有两种方式可以判断)
第一种:利用manager的fileExistsAtPath: isDirectory:方法,可以判断

BOOL dir = NO;
         // 该方法首先会判断filePath存不存在,然后判断该路径对应的是文件还是文件夹
         [manager fileExistsAtPath:filePath isDirectory:&dir];
         // 如果是文件夹就执行下一个循环
         if (dir) continue;

第二种:根据全路径拿出的字典属性中有个是NSFileType,也就是文件类型。用这个也可以判断出是不是文件夹

NSDictionary *attrs = [manager attributesOfItemAtPath:filePath error:nil];
         // 判断是不是文件夹
         if ([attrs[NSFileType] isEqualToString:NSFileTypeDirectory]) continue;

7> 然后就可以定义一个变量totalSize来记录每一个文件大小,依次累加!

totalSize += [attrs[NSFileSize] integerValue];

字典属性中的NSFileSize这个key只能用于文件,不能用于文件夹!

8> 其实manager还有两种方法可以获取缓存路径下所包含的文件,但是两种方法获取的文件有一些差异

// 获取该路径下的文件(只能获取当前文件夹所包含的文件,如果遇到子文件夹,不会继续遍历)
    [manager contentsOfDirectoryAtPath:cachePath error:nil];

    // 这个也是获取所有文件(这个不但可以遍历当前文件夹的内容,还可以遍历子文件夹的内容,范围更广)
    [manager subpathsAtPath:cachePath];

你可能感兴趣的:(缓存,源码解析,SDWebImage)