Objective-C的缓存框架EGOCache在iOS App开发中的使用

2020-01-15 14:06:40于海丽

复制代码
[_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检测缓存时间过期的思路值得学习,以后遇到类似场景,完全可以借鉴。