ZSYCacheQueue作为一种实现队列存储对象的缓存方式。
具体逻辑步骤:
总结:
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]; }
原文:http://www.cnblogs.com/xiongzenghui/p/4647667.html