首页 > 系统服务 > 详细

实现对象缓存框架三、ZSYCacheQueue

时间:2015-07-15 12:33:55      阅读:249      评论:0      收藏:0      [点我收藏+]

 ZSYCacheQueue作为一种实现队列存储对象的缓存方式。

  • ZSYCache依赖一个ZSYCacheHolder对象
  • ZSYCacheQueue创建对象时,使用ZSYCache对象持有的ZSYCacheHolder对象,完成对象持久化
  • 操作1: 将对象入队
  • 操作2: 将对象出队
  • ZSYCacheQueue对象.keysQueue: 这个数组保存依次入队的对象对应的key
  • ZSYCacheQueue对象.offSet:  这个属性是总便宜量

 

    具体逻辑步骤:

  1. 传入一个缓存项【对象、key、超时时间间隔】
  2. 将【对象】和【超时时间间隔】包装成一个【ZSYCacheObject对象】
  3. 使用【ZSYCacheHolder对象】按照【key】保存这个【ZSYCacheObejct对象】-- 【ZSYCacheObejct对象用一个字典保存,并没有顺序】
  4. 检测当前keys队列是否满,如果满进行出队操作
  5. 将最新入队的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];
}

 

实现对象缓存框架三、ZSYCacheQueue

原文:http://www.cnblogs.com/xiongzenghui/p/4647667.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!