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

2020-01-15 14:06:40于海丽
  • 通过定时器来轮询,每隔一段时间检测一次。
  • 写一个while循环来检测。
  • 每次去读取缓存项的时候,判断缓存时间有没有过期。没过期,就返回读取的缓存项;否则,返回nil。
  • 当然,还有一些方法,不一一例举了。仔细想想,这些方法弊端很容易显露出来。

    为了小小的缓存时间,就用定时器轮询,显然是资源浪费
    跟方法1差不多。
    每次读取的时候判断是否过期,如果一直不读取,app的缓存会越来越大,也不可取。
    这些方法都被排除了,还有好的方法吗?继续往下看:

    EGOCache是怎么实现的?

    仔细查看EGOCache源码,发现在initWithCacheDirectory:方法里,每次初始化EGOCache实例对象的时,会遍历一遍plist文件中所有已存在的缓存项,拿每个缓存项的时间和当前时间作比较,缓存项过期时间早于当前时间,则删除对应缓存文件,并删除 plist 文件中对应 key 的记录。

    具体实现代码如下:

    读取缓存项信息

    复制代码
    _cacheInfo = [[NSDictionary dictionaryWithContentsOfFile:cachePathForKey(_directory, @"EGOCache.plist")] mutableCopy];
    if(!_cacheInfo) {
        _cacheInfo = [[NSMutableDictionary alloc] init];
    }
    获取当前时间的NSTimeInterval
    复制代码
    NSTimeInterval now = [[NSDate date] timeIntervalSinceReferenceDate];
    声明removedKeys保存过期的缓存项对应的key
    复制代码
    NSMutableArray* removedKeys = [[NSMutableArray alloc] init];
    遍历缓存项信息并判断缓存时间
    复制代码
    for(NSString* key in _cacheInfo) {
        //判断缓存项过期时间是否早于当前时间
        if([_cacheInfo[key] timeIntervalSinceReferenceDate] <= now) {
            //如果缓存项过期时间早于当前时间,移除缓存项
            [[NSFileManager defaultManager] removeItemAtPath:cachePathForKey(_directory, key) error:NULL];
            //把过期的缓存项对于的key保存到removedKeys里面
            [removedKeys addObject:key];
        }
    }
    删除过期缓存项对于的key