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;
}
代码没看太懂,就先放这里吧。
****本篇文章到这里就结束了,愿大家加班不多工资多,男同胞都有女朋友,女同胞都有男朋友。😊***