ZSYCacheQueue作为一种实现队列存储对象的缓存方式。
- ZSYCache依赖一个ZSYCacheHolder对象
- ZSYCacheQueue创建对象时,使用ZSYCache对象持有的ZSYCacheHolder对象,完成对象持久化
- 操作1: 将对象入队
- 操作2: 将对象出队
- ZSYCacheQueue对象.keysQueue: 这个数组保存依次入队的对象对应的key
- ZSYCacheQueue对象.offSet: 这个属性是总便宜量
具体逻辑步骤:
- 传入一个缓存项【对象、key、超时时间间隔】
- 将【对象】和【超时时间间隔】包装成一个【ZSYCacheObject对象】
- 使用【ZSYCacheHolder对象】按照【key】保存这个【ZSYCacheObejct对象】-- 【ZSYCacheObejct对象用一个字典保存,并没有顺序】
- 检测当前keys队列是否满,如果满进行出队操作
- 将最新入队的key入keysQueue尾部
总结:
1. keysQueue按队列顺序保存入队对象的key,而对象被封住成ZSYCacheObect,被ZSYCacheHolder对象使用字典保存。
2. 找到这个原始对象,首先去keysQueue找到key,然后通过ZSYCacheHolder对象使用key去【字典对象】查询到ZSYCacheObject对象,再通过ZSYCacheObject的方法得到原始缓存对象。
开始贴代码:
//.h #import <Foundation/Foundation.h> @class ZSYCacheHolder; @interface ZSYCacheQueue : NSObject @property (nonatomic, strong) NSString *name; @property (nonatomic, assign) NSInteger size; @property (nonatomic, strong, readonly) NSMutableArray *keysQueue; @property (nonatomic, copy) void (^onPop)(id popedObject); @property (nonatomic, copy) void (^onExpirate)(id popedObject); - (instancetype)initWithHolder:(ZSYCacheHolder *)holder; //key入队 - (void)zsyPushObj:(id)obj; //对象出队 - (id)zsyPopObj; @end
//.m //init时候,使用ZSYCache对象的ZSYCacheHolder完成后续的持久化对象操作 - (instancetype)initWithHolder:(ZSYCacheHolder *)holder { self = [super init]; if (self) { _holder = holder; _size = ZSYCACHE_DEFAULT_QUEUE_SIZE; _offset = 0; _keysQueue = [NSMutableArray array]; } return self; }
// 将要缓存的对象入队 - (void)zsyPushObj:(id)obj { //偏移量++ self.offset++; //检测超时的缓存对象,一旦超时,从缓存队列删除对应的key,本地NSData文件 [self _cleanExpirateObjects]; //得到缓存对象在队列的对应的唯一key NSString *key = [NSString stringWithFormat:@"QUEUE_%@_%ld", self.name, self.offset]; //使用唯一的key , 作为对象入队列的标识 [_holder zsySetObject:obj ForKey:key Duration:0]; //如果此时队列已经满,将队列头部对象出队列 if (_keysQueue.count >= _size) { //找到key队列头部的key NSString *popKey = _keysQueue.firstObject; //找到key对应的ZSYCacheObject ZSYCacheObject *cachedObject = [_holder zsyGetObjectForKey:key]; //执行对象在出队时的回调Block if (_onPop) { _onPop([cachedObject cacheObjectValue]); } //使用ZSYCacheHolder对象,删除本地缓存对象文件 [_holder zsyRemoveObjectForKey:popKey];//本地移除 //将当前队列头部的key,从key数组删除 [_keysQueue removeObject:popKey];//内存key数组移除 } //入队当前最新缓存对象的key [_keysQueue addObject:key]; }
时间: 2024-10-09 15:13:23