iOS—缓存YYCache框架

来源:互联网 发布:winebottler linux 编辑:程序博客网 时间:2024/05/17 21:43

下载地址 :点击打开链接

一、简介:
计算上的的cache 就是高速缓存,计算机组成课程里的定义是,存在于主存和cpu之间,主要用于解决CPU处理数据的速度远远大于读取主存数据的速度。
手机上也有cache ,主要作用是保存一些软件生成的临时文件,避免每次都要重复地向服务器请求相同的数据,即浪费用户流量,也影响app响应速度。
二、YYCache 的组成
YYCache 由YYcache、YYDiskCache、YYMemoryCache 和YYKVStroage组成,其中YYKVStorage可直接对sqlite 和文件系统进行读写(YYDiskCache的底屋实现)

注意点
1.如果保存的自定义对象不遵守NSCoding的协议或不实现NSCoding协议的方法,就不能使用YYDiskCache进行长期缓存;
- (void)encodeWithCoder:(NSCoder *)aCoder;- (instancetype)initWithCoder:(NSCoder *)aDecoder;

一、YYCache 基本使用
1、同步方式
  //模拟数据    NSString *value=@"I want to know who is lcj ?";    //模拟一个key    //同步方式    NSString *key=@"key";    YYCache *yyCache=[YYCache cacheWithName:@"LCJCache"];    //根据key写入缓存value    [yyCache setObject:value forKey:key];    //判断缓存是否存在    BOOL isContains=[yyCache containsObjectForKey:key];    NSLog(@"containsObject : %@", isContains?@"YES":@"NO");    //根据key读取数据    id vuale=[yyCache objectForKey:key];    NSLog(@"value : %@",vuale);    //根据key移除缓存    [yyCache removeObjectForKey:key];    //移除所有缓存    [yyCache removeAllObjects];



2、异步方式
 //模拟数据    NSString *value=@"test文字";    //存取时key    NSString *key =@"key";    //创建目录    YYCache *cache=[YYCache cacheWithName:@"haha"];        //判断缓存是否存在    [cache containsObjectForKey:key withBlock:^(NSString * _Nonnull key, BOOL contains) {            }];        //根据key写入缓存        [cache setObject:value forKey:key withBlock:^{            }];            //读取    [cache objectForKey:key withBlock:^(NSString * _Nonnull key, id<NSCoding>  _Nonnull object) {                NSLog(@"%@",object);    }];        //根据key 移除缓存        [cache removeObjectForKey:key withBlock:^(NSString * _Nonnull key) {            }];        // 移除所有缓存    [cache removeAllObjectsWithBlock:^{            }];        //移除所有缓存带进度    [cache removeAllObjectsWithProgressBlock:^(int removedCount, int totalCount) {                    } endBlock:^(BOOL error) {                if (!error) {                        NSLog(@"移除成功");        }        else        {            NSLog(@"移除失败");        }            }];
二、YYCache 缓存LRU清理
LRU(Least Recently used)算法大家都比较熟悉,翻译过来就是“最近最少使用”,LRU缓存就是使用这种原理实现,简单的说就是缓存一定量的数据,当超过设定的阈值时就把一些过期的数据删除掉,比如我们缓存10000条数据,当数据小于10000时可以随意添加,当超过10000时就需要把新的数据添加进来,同时要把过期数据删除,以确保我们最大缓存10000条,那怎么确定删除哪条过期数据呢,采用LRU算法实现的话就是将最老的数据删掉。
    YYCache *cache=[YYCache cacheWithName:@"myText"];        //内存最大缓存数据个数    [cache.memoryCache setCountLimit:50];        //内存最大缓存开销,目前这个没有效果    [cache.memoryCache setCostLimit:1*1024];        //磁盘最大缓存开销    [cache.diskCache setCostLimit:1*1024];        //磁盘最大缓存数据个数    [cache.diskCache setCountLimit:50];        //设置磁盘lru动态清理频率 默认 60秒    [cache.diskCache setAutoTrimInterval:60];            for (int i=0; i<100; i++) {                NSString *str=[NSString stringWithFormat:@"第%d条数据",i+1];                NSString *key=[NSString stringWithFormat:@"key%d",i];                [cache setObject:str  forKey:key];                    }        NSLog(@"cache.memoryCache.totalCost=%lu",(unsigned long)cache.memoryCache.totalCost);    NSLog(@"cache.memoryCache.costLimit=%lu",(unsigned long)cache.memoryCache.costLimit);            NSLog(@"cache.memoryCache.totalCount=%lu",(unsigned long)cache.memoryCache.totalCount);     NSLog(@"cache.memoryCache.countLimit=%lu",(unsigned long)cache.memoryCache.countLimit);            NSLog(@"cache.diskCache.totalCost=%lu",(unsigned long)cache.diskCache.totalCost);    NSLog(@"cache.diskCache.costLimit=%lu",(unsigned long)cache.diskCache.costLimit);        NSLog(@"cache.diskCache.totalCount=%lu",(unsigned long)cache.diskCache.totalCount);    NSLog(@"cache.diskCache.countLimit=%lu",(unsigned long)cache.diskCache.countLimit);            for(int i=0 ;i<100;i++){        //模拟一个key        NSString *key=[NSString stringWithFormat:@"key%d",i];                id vuale=[cache objectForKey:key];        NSLog(@"%@=%@",key ,vuale);    }