搜索
您的当前位置:首页正文

iOS开发之看也看不太懂的YYCache

来源:二三娱乐

YYCache如雷贯耳,
鄙人听之,用之,然,知其然不知其所以然,此非IT人士之特性。
前辈告之,当世成大牛者,不唯有聪明大脑亦有读源码之习惯。惭愧、惭愧,今日决心一览YYCache之庐山真面目,然看也没咋看懂。。。

说说我看到的YYCache

YYCache的使用

 YYCache * yyCache = [YYCache cacheWithName:CacheName];
NSString * value = @"存储的数据...";
NSString * key = Key;
// 进行存储
[yyCache setObject:value forKey:key];
// 取值
NSString * getValue = [yyCache objectForKey:key];

/***************************************************************/

  YYCache * yyCache = [YYCache cacheWithName:CacheName];
// 移除所有缓存
[yyCache removeAllObjects];
// 是否有值
BOOL isContains = [yyCache containsObjectForKey:Key];

YYCache的内部

YYCache进行存储的主要是两个类:YYMemoryCache、YYDiskCache,前者用来将数据存储到内存中,后者用来将数据存储到磁盘中,两者的实例都是YYCache的属性。
YYMemoryCache内存储存是的原理是利用CFDictionary对象的 key-value开辟内存储存机制和双向链表原理来实现LRU算法。(copy别人的)

YYMemoryCache

存储代码:

  - (void)setObject:(id)object forKey:(id)key withCost:(NSUInteger)cost {
// 避免使用者错误使用
if (!key) return;
if (!object) {
    [self removeObjectForKey:key];
    return;
}
pthread_mutex_lock(&_lock); // 上锁
// _YYLinkedMap *_lru;
// 获取字典中某个键对应的值   查找是否存在对应的key的节点
_YYLinkedMapNode *node = CFDictionaryGetValue(_lru->_dic, (__bridge const void *)(key));
NSTimeInterval now = CACurrentMediaTime();
if (node) {
    _lru->_totalCost -= node->_cost;
    _lru->_totalCost += cost;
    node->_cost = cost;
    node->_time = now;
    node->_value = object;
    [_lru bringNodeToHead:node];    // 将内部的一个节点放到头部
} else {
    node = [_YYLinkedMapNode new];
    node->_cost = cost;
    node->_time = now;
    node->_key = key;
    node->_value = object;  // value存储Object
    [_lru insertNodeAtHead:node];   // 插入一个节点到头节点
}
if (_lru->_totalCost > _costLimit) {
    dispatch_async(_queue, ^{
        [self trimToCost:_costLimit];
    });
}
if (_lru->_totalCount > _countLimit) {
    _YYLinkedMapNode *node = [_lru removeTailNode];
    if (_lru->_releaseAsynchronously) {
        dispatch_queue_t queue = _lru->_releaseOnMainThread ? dispatch_get_main_queue() : YYMemoryCacheGetReleaseQueue();
        dispatch_async(queue, ^{
            [node class]; //hold and release in queue
        });
    } else if (_lru->_releaseOnMainThread && !pthread_main_np()) {
        dispatch_async(dispatch_get_main_queue(), ^{
            [node class]; //hold and release in queue
        });
    }
}
pthread_mutex_unlock(&_lock);   // 解锁
}

取值代码:

  - (id)objectForKey:(id)key {
if (!key) return nil;
pthread_mutex_lock(&_lock);
_YYLinkedMapNode *node = CFDictionaryGetValue(_lru->_dic, (__bridge const void *)(key));
if (node) {
    node->_time = CACurrentMediaTime();
    [_lru bringNodeToHead:node];
}
pthread_mutex_unlock(&_lock);
return node ? node->_value : nil;
}

代码没看太懂,就先放这里吧。

****本篇文章到这里就结束了,愿大家加班不多工资多,男同胞都有女朋友,女同胞都有男朋友。😊***

Top