缓存-YYCache

参考文档

NSCache

NSCache 与 NSMutableDictionary 用法相似,但是线程安全的,不需要加锁,在系统内存很低时,会自动释放一些对象,多用于get 请求。

-(NSCache*)myCache{
    if (!_myCache) {
        
        _myCache = [[NSCache alloc]init];
        _myCache.countLimit = 30; //设置了最大存储对象最大数量
        _myCache.delegate = self; //设置代理
    }
    return _myCache;
}
-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{
    
    
    for (int i = 0; i < 50; i++) {
        NSString *str = [NSString stringWithFormat:@"测试%d",i];
        [self.myCache setObject:str forKey:@(i)];
    }
    for (int i = 0; i < 50; i++) {
        NSLog(@"%d-%@",i,[self.myCache objectForKey:@(i)]);
    }
}
//代理方法缓存过限时自动清理之前的数据
//一般用于程序测试
- (void)cache:(NSCache*)cache willEvictObject:(nonnull id)obj {
    NSLog(@"删除-%@",obj);
}

YYCache

  • YYCache 主要由YYCache、YYDiskCache和YYMemoryCache组成
    在不指定存储方式下,先从内存中读取,没有则从磁盘读取,有就用,并写入内存,没有则返回空。
//设置YYCache属性,类似于创建数据表,name即表名
 YYCache *cache = [[YYCache alloc] initWithName:@"SPHttpCache"];
 cache.memoryCache.shouldRemoveAllObjectsOnMemoryWarning = YES;
 cache.memoryCache.shouldRemoveAllObjectsWhenEnteringBackground = YES;
    
 id cacheData;
 if (isCache) {//如果需要缓存
    
    //根据网址从Cache中取数据
     cacheData = [cache objectForKey:cacheKey];//key为缓存的key

        if (cacheData != 0) {//如果有缓存数据
            //将数据统一处理缓存数据,并有有网的情况下对缓存数据进行对比
            [self returnDataWithRequestData:cacheData Success:^(NSDictionary *requestDic, NSString *msg) {
                MCLog(@"缓存数据\n\n    %@    \n\n",requestDic);
                success(requestDic,msg);
            } failure:^(NSString *errorInfo) {
                failure(errorInfo);
            }];
        }
    }
    
    //进行网络检查
    if (![self requestBeforeJudgeConnect]) {
        failure(@"没有网络");
        MCLog(@"\n\n----%@------\n\n",@"没有网络");
        return;
    }
    //如果有网络,则进行网络请求
     。。。。。

网络数据请求回来后,作比对处理

//缓存数据与请求回的数据不一致,则更新数据 
if (![cacheData isEqual:requestData]) {
    id myResult = [NSJSONSerialization JSONObjectWithData:requestData options:NSJSONReadingMutableContainers error:nil];
    
    
    //判断是否为字典
    if ([myResult isKindOfClass:[NSDictionary  class]]) {
        NSDictionary *  requestDic = (NSDictionary *)myResult;
     
     //根据返回的接口内容来变
        NSString * succ = requestDic[@"status"];
        if ([succ isEqualToString:@"success"]) {
            success(requestDic[@"result"],requestDic[@"msg"]);
        }else{
            failure(requestDic[@"msg"]);
        }
        
    }
}
      

你可能感兴趣的:(缓存-YYCache)