NSCache
NSCache 与 NSMutableDictionary 用法相似,但是线程安全的,不需要加锁,在系统内存很低时,会自动释放一些对象,多用于get 请求。
-(NSCache*)myCache{
if (!_myCache) {
_myCache = [[NSCache alloc]init];
_myCache.countLimit = 30; //设置了最大存储对象最大数量
_myCache.delegate = self; //设置代理
}
return _myCache;
}
-(void)touchesBegan:(NSSet<UITouch *> *)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"]);
}
}
}