复制代码
[_cacheInfo removeObjectsForKeys:removedKeys];
看到这些,是不是觉得人家思路特牛叉,反正,我是觉得这个作者不简单。到这一步就解决了吗?
EGOCache还做了什么?
细心的童鞋会发现:EGOCache是个单列类,也就是说整个程序应用周期只初始化一次。
复制代码+ (instancetype)globalCache {
static id instance;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
instance = [[[self class] alloc] init];
});
return instance;
}
每次初始化的时候去判断了缓存项是否过期,这样做非常正确。思考一个场景:
用户打开app,EGOCache被初始化,并判断了缓存项是否过期。
如果刚好有一些缓存项在EGOCache被初始化之后过期。这个时候我们依然可以读到这个缓存项。这就不对了。
继续分析EGOCache源码发现,EGOCache在读取一个缓存项的时候,先判断缓存项是否存在,然后读取缓存项(注意:是读取EGOCache初始化的时候没有过期的缓存项,并没有说现在没有过期),最后去判断读取到的缓存项跟当前时间相比是否过期.
具体实现如下:
复制代码- (BOOL)hasCacheForKey:(NSString*)key {
//读取EGOCache初始化的时候没有过期的缓存项
NSDate* date = [self dateForKey:key];
if(date == nil) return NO;
//判断读取到的缓存项当前是否过期
if([date timeIntervalSinceReferenceDate] < CFAbsoluteTimeGetCurrent()) return NO;
return [[NSFileManager defaultManager] fileExistsAtPath:cachePathForKey(_directory, key)];
}
- (NSDate*)dateForKey:(NSString*)key {
__block NSDate* date = nil;
dispatch_sync(_frozenCacheInfoQueue, ^{
date = (self.frozenCacheInfo)[key];
});
return date;
}
EGOCache检测缓存时间过期的思路值得学习,以后遇到类似场景,完全可以借鉴。










