ZSYCache作为给调用者暴露的主要Api方法,来实现对象的缓存。
思路:
1. 每一个ZSYCache对象,可以存在多个缓存队列、对个缓存池。
2. 每一个新创建的ZSYCache对象,他们的 缓存队列、缓存池,应该是互相独立。
3. 使用单例对象,应该提供默认的缓存队列、缓存池
4. 根据 名字--队列,名字--池, 保存多个队列、池
5. 在哪个时刻将内存队列、内存池的所有对象持久化到本地
6. 在哪个时刻将本地对象,恢复到内存队列、内存池
下面给出代码:
//.h #import <Foundation/Foundation.h> #import "ZSYCacheHolder.h" @interface ZSYCache : NSObject //ZSYCache名字 @property (nonatomic, copy , readonly) NSString *name; //按key保存队列对象 @property (nonatomic, strong, readonly) NSMutableDictionary *queues; //按key保存池对象 @property (nonatomic, strong, readonly) NSMutableDictionary *pools; //依赖一个持久化工具对象 @property (nonatomic, strong, readonly) ZSYCacheHolder *holder; + (instancetype)sharedCache; - (instancetype)initWithIdentifier:(NSString *)identifier; //添加一个新的队列 - (void)addQueue:(NSString *)queueName Size:(NSInteger)size; //添加一个新的池 - (void)addPool:(NSString *)poolName Size:(NSInteger)size; //对象与队列的操作 - (void)zsyPushObject:(id)obj ToQueue:(NSString *)queueName; - (id)zsyPopFromQueue:(NSString *)queueName; - (NSArray *)objectsInQueue:(NSString *)queueName; //获取当前ZSYCache对象在内存缓存的总大小 - (NSInteger)memorySize; //对象的持久化 - (void)save; - (void)load; //对象的恢复 + (void)save; + (void)load; @end
//.m //首先是init函数,初始化ZSYCache对象的参数 - (instancetype)initWithIdentifier:(NSString *)identifier { self = [super init]; if (self) { _name = [identifier copy]; //保存池的字典 _pools = [NSMutableDictionary dictionary]; //保存队列的字典 _queues = [NSMutableDictionary dictionary]; //保存设置的字典 _options = [NSMutableDictionary dictionary]; //依赖工具对象 _holder = [[ZSYCacheHolder alloc] initWithIdentifier:_name]; //添加默认的队列、池 [self addQueue:nil Size:0]; [self addPool:nil Size:0]; } return self; }
// 添加一个新的队列对象到ZSYCache对象 - (void)addQueue:(NSString *)queueName Size:(NSInteger)size { if (!queueName || [queueName isEqualToString:@""]) { queueName = ZSYCACHE_DEFAULT_QUEUE_NAME; } if ([self.queues hasKey:queueName]) { return; } ZSYCacheQueue *queue = [[ZSYCacheQueue alloc] initWithHolder:_holder]; queue.name = queueName; if (size > 0) { queue.size = size; } [self.queues setObject:queue forKey:queueName]; }
//将对象缓存到队列 - (void)zsyPushObject:(id)obj ToQueue:(NSString *)queueName {
if (!queueName || [queueName isEqualToString:@""]) { queueName = ZSYCACHE_DEFAULT_QUEUE_NAME; }
ZSYCacheQueue *queue = self.queues[queueName]; [queue zsyPushObj:obj]; }
//将缓存队列头部对象出队 - (id)zsyPopFromQueue:(NSString *)queueName { if (!queueName || [queueName isEqualToString:@""]) { queueName = ZSYCACHE_DEFAULT_QUEUE_NAME; } ZSYCacheQueue *queue = self.queues[queueName]; id pop = [queue zsyPopObj]; return pop; }
//获取缓存队列中的所有缓存对象 - (NSArray *)objectsInQueue:(NSString *)queueName { if (!queueName || [queueName isEqualToString:@""]) { queueName = ZSYCACHE_DEFAULT_QUEUE_NAME; } ZSYCacheQueue *queue = self.queues[queueName]; NSMutableArray *cacheList = [NSMutableArray array]; //注意:ZSYCacheQueue只有key数组【每一个key找到缓存对象】, //每一个key对应一个 ZSYCacheObejct,并不是直接对应缓存对象 for (int i = 0; i < [queue.keysQueue count]; i++) { NSString *key = queue.keysQueue[i]; //通过key查找到 ZSYCacheObject的一个对象 ZSYCacheObject *cacheObj = [_holder zsyGetObjectForKey:key]; //从ZSYCacheObejct对象,获取到保存的原始对象 if (cacheObj.cacheObjectValue) { [cacheList addObject:cacheObj.cacheObjectValue]; } } return cacheList; }
其他的暂未实现,后续实现后再加上来。
原文:http://www.cnblogs.com/xiongzenghui/p/4647591.html