使用PINCache优化代码

作者: 蜗牛你慢慢来 | 来源:发表于2019-08-01 15:46 被阅读0次

前言

客户反馈查看图片的速度非常慢,于是我们需要做一下图片的缓存,由于图片都是后台base64传过来的,所以,需要存在本地,无法使用SDWebImage来进行优化。

原始做法

1.保存图片,使用NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
生成的路径+图片名 作为key,保存图片。

#pragma mark - 保存图片
-(void)saveImages:(NSArray *)arr
{
    NSString *filePath = [self generateFilePath];
    if (![[NSFileManager defaultManager] fileExistsAtPath:filePath]) {
        [[NSFileManager defaultManager] createDirectoryAtPath:filePath withIntermediateDirectories:YES attributes:nil error:nil];
    }
    [arr enumerateObjectsUsingBlock:^(GetBussinessRecivingImagePage * _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
        
        NSString *imgPath = [filePath stringByAppendingString:obj.ImageName];
        NSError *error = nil;
        BOOL result = [UIImagePNGRepresentation(obj.image) writeToFile:imgPath options:NSDataWritingAtomic error:&error];
        
        if (!result) {
            NSLog(@"\n%@", imgPath);
        }
    }];
}

#pragma mark - 生成路径
-(NSString *)generateFilePath
{
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *filePath = [[paths objectAtIndex:0] stringByAppendingString:[NSString stringWithFormat:@"/ScanningCopy/%@/%@/",self.xxx, self.xxx]];
    return filePath;
}
  1. 获取图片,使用生成的路径+文件名作为key,来获取图片。
#pragma mark - 获取图片
-(NSArray *)getImages
{
    NSString *filePath = [self generateFilePath];
    NSFileManager *fm = [NSFileManager defaultManager];
    NSArray *files = [fm subpathsAtPath:filePath];
    NSMutableArray *images = [NSMutableArray array];
    [files enumerateObjectsUsingBlock:^(id  _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
        
        UIImage *img = [[UIImage alloc] initWithContentsOfFile:[NSString stringWithFormat:@"%@/%@",filePath,obj]];
        
        [images addObject:img];
    }];
    return images;
}
  1. 删除图片,使用 路径+图片名 作为key来删除图片。
#pragma mark - 删除图片
-(void)deleateImages
{
    NSString *filePath = [self generateFilePath];
    NSFileManager *fm = [NSFileManager defaultManager];
    NSArray *files = [fm subpathsAtPath:filePath];
    [files enumerateObjectsUsingBlock:^(id  _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
        
        NSError *error = nil;
        BOOL res = [fm removeItemAtPath:[NSString stringWithFormat:@"%@/%@",filePath,obj] error:&error];
        if (!res) {
            NSLog(@"%@", obj);
        }
    }];
}
  1. 当图片超过1G的时候,进行清理,清理的顺序依次是10天前,5天前,3天前和所有。
#pragma mark - 计算现有图片占据的大小
-(void)calculateCacheSize
{
    float maxsize = 1024;
    NSString *cachePath = [self generateFilePath];
    float size = [self folderSizeAtPath:cachePath];
    if (size > maxsize) {
        
        NSDate *tenDaysBefore = [[NSDate date] initWithTimeIntervalSinceNow:24*60*60*(-10)];
        [self cleanFolder:cachePath before:tenDaysBefore];
    }
    
    size = [self folderSizeAtPath:cachePath];
    if (size > maxsize) {
        
        NSDate *fiveDaysBefore = [[NSDate date] initWithTimeIntervalSinceNow:24*60*60*(-5)];
        [self cleanFolder:cachePath before:fiveDaysBefore];
    }
    
    size = [self folderSizeAtPath:cachePath];
    if (size > maxsize) {
        
        NSDate *fiveDaysBefore = [[NSDate date] initWithTimeIntervalSinceNow:24*60*60*(-3)];
        [self cleanFolder:cachePath before:fiveDaysBefore];
    }
    
    size = [self folderSizeAtPath:cachePath];
    if (size > maxsize) {
        
        NSDate *nowDate = [NSDate date];
        [self cleanFolder:cachePath before:nowDate];
    }
}

#pragma mark - 清除beforeDate之前的图片
-(void)cleanFolder:(NSString *)folderPath before:(NSDate *)beforeDate
{
    NSFileManager *fm = [NSFileManager defaultManager];
    if (![fm fileExistsAtPath:folderPath]) return;
    
    NSEnumerator *childFilesEnumerator = [[fm subpathsAtPath:folderPath] objectEnumerator];
    NSString *fileName;
    while ((fileName = [childFilesEnumerator nextObject]) != nil) {
        NSString *fileAbsolutePath = [folderPath stringByAppendingPathComponent:fileName];
        NSError *error = nil;
        NSDictionary *fileAttributes = [fm attributesOfItemAtPath:fileAbsolutePath error:&error];
        NSDate *creationDate = [fileAttributes objectForKey:NSFileCreationDate];
        //创建时间跟需要删除的时间比较,若创建时间在指定要删除的日期前面,则删除
        if ([beforeDate compare:creationDate] == NSOrderedDescending) {
            [fm removeItemAtPath:fileAbsolutePath error:&error];
        }
    }
}

#pragma mark - 生成路径
-(NSString *)generateFilePath
{
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *filePath = [[paths objectAtIndex:0] stringByAppendingString:[NSString stringWithFormat:@"/xxx"]];
    return filePath;
}

#pragma mark - 单个文件的大小
-(long long)fileSizeAtPath:(NSString *)filePath
{
    NSFileManager *manager = [NSFileManager defaultManager];
    if ([manager fileExistsAtPath:filePath]) {
        NSError *error = nil;
        return [[manager attributesOfItemAtPath:filePath error:&error] fileSize];
    }
    return 0;
}

#pragma mark - 遍历文件夹来获得文件夹大小,返回多少M
-(float)folderSizeAtPath:(NSString *)folderPath
{
    NSFileManager *fm = [NSFileManager defaultManager];
    if (![fm fileExistsAtPath:folderPath]) return 0;
    
    NSEnumerator *childFilesEnumerator = [[fm subpathsAtPath:folderPath] objectEnumerator];
    NSString *fileName;
    long long folderSize = 0;
    while ((fileName = [childFilesEnumerator nextObject]) != nil) {
        NSString *fileAbsolutePath = [folderPath stringByAppendingPathComponent:fileName];
        folderSize += [self fileSizeAtPath:fileAbsolutePath];
    }
    return folderSize/(1024.0*1024.0);
}

使用PINCache优化

三句代码替换了上面这一堆。

//保存图片
[[PINCache sharedCache] setObject:self.imgArr forKey:self.pguid];
//磁盘使用最大开销限制为1G
[[PINCache sharedCache].diskCache setByteLimit:1024*1024*1024];
//取图片
NSArray *localImages = [[PINCache sharedCache] objectForKey:self.pguid];

相关文章

  • 使用PINCache优化代码

    前言 客户反馈查看图片的速度非常慢,于是我们需要做一下图片的缓存,由于图片都是后台base64传过来的,所以,需要...

  • iOS - 常见框架使用

    1. PINCache -->PINCache是多线程安全的,使用键值对来保存数据。PINCache内部包含了2个...

  • 【hihoCoder 1534】Array Partition

    Array Partition(题目链接) 思路 使用前缀和优化 使用hash表(map)优化 代码

  • 实战001-提煤单明细查询

    一、code 二、优化代码 2.1、优化在循环中发SQL 优化后代码 二、SQL 二、使用 Profile 分析 ...

  • 老友记之PHP7留言板开发(步骤三)

    本步骤纲目:1、优化代码 说是代码优化,其实就是将多次使用的公共部分代码整理起来,在需要调用的页面使用includ...

  • 代码细节优化

    纯代码细节优化 使用下放代码创建一个视图

  • 16.7 内联函数(inline function)

    使用宏代码内联优化函数的执行。

  • <安全攻防之编译器的优化>

    Xcode在debug情况下,默认不会对代码进行优化.在release模式下会对代码进行优化去除冗余的代码(未使用...

  • Flutter 优化

    Flutter 项目优化 1.代码优化 冗余代码 、 封装 2.包大小 压缩本地图片,使用网站https://ti...

  • PINCache

    PINCache 是一个适用于 iOS,tvOS 和 OS X 的快速、无死锁的并行对象缓存框架。 PINCach...

网友评论

    本文标题:使用PINCache优化代码

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