项目地址 https://github.com/enormego/EGOCache/
EGOCache是一个轻量级的缓存框架。用法简单方便,在现在的项目中,我就用到EGOCache来缓存下载过的照片和字符串,还能设置这些存储值的有效时间。
简单用法
NSString* saveString=@"xxx";
[[EGOCacheglobalCache]setString:saveStringforKey:@"xxx"withTimeoutInterval:24*60*60];
NSString* xxx=[[EGOCacheglobalCache]stringForKey:@"xxx"];
NSLog(@"xxx=%@",xxx);
学习笔记
1. 对于一些常用的代码片段可以使用宏定义,减少冗余代码
#if DEBUG
#define CHECK_FOR_EGOCACHE_PLIST() if([key isEqualToString:@"EGOCache.plist"]) { \
NSLog(@"EGOCache.plist is a reserved key and can not be modified."); \
return; }
#else
#define CHECK_FOR_EGOCACHE_PLIST() if([key isEqualToString:@"EGOCache.plist"]) return;
#endif
2.内联函数的使用, 消除函数调用时的时间开销 ,同事代码也比较简洁
static inline NSString* cachePathForKey(NSString* directory,NSString* key) {
key = [keystringByReplacingOccurrencesOfString:@"/"withString:@"_"];
return[directorystringByAppendingPathComponent:key];
}
3.文中大量使用了GCD技术,这里不详细介绍GCD,请大家参考一本PDF教程
下载地址 http://download.csdn.net/detail/dongsh315/7240711
4.单例模板
+ (instancetype)globalCache {
static id instance;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
instance = [[[self class] alloc] init];
});a
return instance;
}
5. 在删除文件时避免要删的文件和存储本地的文件重名
- (void)removeCacheForKey:(NSString*)key {
CHECK_FOR_EGOCACHE_PLIST(); //巧妙之处
dispatch_async(_diskQueue, ^{
[[NSFileManager defaultManager] removeItemAtPath:cachePathForKey(_directory, key) error:NULL];
});
[self setCacheTimeoutInterval:0 forKey:key];
}
6.这里是设置 _frozenCacheInfoQueue _cacheInfoQueue 两个变量的原因 , 两个都是用来保存键值对的字典 ,比较文中的代码发现, 代码很相似 , 区别是 _cacheInfoQueue 多了 self.frozenCacheInfo= [_cacheInfocopy]; 和 [selfsetNeedsSave]; 从注释中就可以看出 _frozenCacheInfo 是为了快速读出新值的需要 而 _cacheInfocopy是为了保存写入文件的需要 _cacheInfocopy滞后一些 。
7. 存储值的有效时间思路
存储时把时间存下来就好了 下次读出时如果时间比当前时间小说明 失效