最近项目空窗期,动手封装一个简便的带有缓存功能的类。主要基于第三方的TMCache和AFNetworking。
TMCache
TMCache 是一种键/值存储缓存系统,用于持久存储那些复制成本很高的临时对象,例如下载的数据或处理缓慢的结果。由磁盘缓存和内存缓存组成。(目前已经停止维护)
特点:
- 线程安全
- 由GCD支持
- 如果收到内存警告或者APP进入后台, 内存缓存将被清理。
而磁盘缓存需要手动清理,或者设置时间/大小限制 - 能够缓存任何支持NSCoding的对象(最重要的就是UIImage),通过key存取
TMCache由三个类构成,TMCache,TMDiskCache和TMMemoryCache。TMCache对TMDiskCache和TMMemoryCache进行了封装,其本身并未做实质的缓存工作。
TMCache拥有一个concurrent queue,基本上所有存取对象的操作都在这个queue中进行,可以进行异步或者同步存取(异步方法是主体[两个操作同时完成才算完成],同步方法是通过信号量将异步变为同步的)
取对象流程:
流程图.pngTMCache可能出现死锁,我增加了LockSignalQueueModel类,解决死锁问题,原理就是保证只有一个dispatch_queue_t
下面讲解demo
下载地址在这:NCDataWareModel
NCDataWareModel
封装的缓存类
通过请求url已经部分请求参数拼接做为key来存储数据
//获取key
- (NSString *)produceKey:(NSString *)requestFunc withOffset:(NSDictionary *)offset {
return [[NSString stringWithFormat:@"%@%@", requestFunc, offset ? offset.description : @""] MD5];
}
//读取缓存
- (void)obtainData:(NSString *)requestFunc withOffset:(NSDictionary *)offset withBlock:(TMCacheObjectBlock)blo {
[self objectForKey:[self produceKey:requestFunc withOffset:offset] block:blo];
}
//存储缓存
- (void)cacheData:(id<NSCoding>)data withRequestFunc:(NSString *)requestFunc withOffset:(NSDictionary *)offset {
NSDictionary *dic = [NSDictionary dictionaryWithObjectsAndKeys:data, @"data", [NSDate date], @"date", nil];
[self setObject:dic forKey:[self produceKey:requestFunc withOffset:offset] block:^(TMCache *cache, NSString *key, id object) {
}];
}
RequestModel
基于AFNetworking疯转的请求类
NSString* url = @"supermarket/category/all/layer/products";
NSDictionary *params = @{@"categoryId":self.selectedLeftModel.Kid,
@"promotion":@"0",
@"orderSort":@"0",
@"orderBy":@"0",
@"all":@"0"
};
[RequestModel requestFunc:url
params:params
withRequestType:@"GET"
withStartRequest:false
withSaveCache:true withOffset:@{@"categoryId":self.selectedLeftModel.Kid}
success:^(id _Nonnull response) {
//请求成功处理
} failure:^(NSError * _Nonnull err) {
//请求失败处理
}];
- requstType 请求类型,”GET“ 或 ”POST“
- startRequest 为true时,不读缓存,直接请求服务器数据
为false时,读缓存,如果没有缓存则会请求服务器数据 - saveCache 是否保存缓存,为true 则请求服务器数据后会保存数据
- offset 部分入参,主要用于区分同一个请求下不同数据,比如同一个url不同id请求的不同列表
集成
下载demo,将工程中的NCDataWareModel拖入到工程了,如果libs文件夹下相关的第三方已经导入,替换掉就可以了。
写的有些仓促,文章和代码若有不对地方,欢迎批评指正
网友评论