YYKIT系列之 —— YYCache
YYCache是一个优秀的缓存框架,其文件结构如下:
YYCache的文件结构分为四个,YYCAche、YYDiskCache、YYKVStorage、YYMemoryCache
YYCAche使用以及介绍:
初始化方法:
- (nullable instancetype)initWithName:(NSString *)name;
- (nullable instancetype)initWithPath:(NSString *)path;
+ (nullable instancetype)cacheWithName:(NSString *)name;
+ (nullable instancetype)cacheWithPath:(NSString *)path;
属性:
@property (copy, readonly) NSString *name;
@property (strong, readonly) YYMemoryCache *memoryCache;
@property (strong, readonly) YYDiskCache *diskCache;
缓存操作方法:
- (BOOL)containsObjectForKey:(NSString *)key;
- (void)containsObjectForKey:(NSString *)key withBlock:(nullable void(^)(NSString *key, BOOL contains))block;
- (nullable id<NSCoding>)objectForKey:(NSString *)key;
- (void)objectForKey:(NSString *)key withBlock:(nullable void(^)(NSString *key, id<NSCoding> object))block;
- (void)setObject:(nullable id<NSCoding>)object forKey:(NSString *)key;
- (void)setObject:(nullable id<NSCoding>)object forKey:(NSString *)key withBlock:(nullable void(^)(void))block;
- (void)removeObjectForKey:(NSString *)key;
- (void)removeObjectForKey:(NSString *)key withBlock:(nullable void(^)(NSString *key))block;
- (void)removeAllObjects;
- (void)removeAllObjectsWithBlock:(void(^)(void))block;
- (void)removeAllObjectsWithProgressBlock:(nullable void(^)(int removedCount, int totalCount))progress
endBlock:(nullable void(^)(BOOL error))end;
源文件中的一些方法实现初探:
- (instancetype)initWithName:(NSString *)name {
if (name.length == 0) return nil;
NSString *cacheFolder = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) firstObject];
NSString *path = [cacheFolder stringByAppendingPathComponent:name];
return [self initWithPath:path];
}
- (instancetype)initWithPath:(NSString *)path {
if (path.length == 0) return nil;
YYDiskCache *diskCache = [[YYDiskCache alloc] initWithPath:path];
if (!diskCache) return nil;
NSString *name = [path lastPathComponent];
YYMemoryCache *memoryCache = [YYMemoryCache new];
memoryCache.name = name;
self = [super init];
_name = name;
_diskCache = diskCache;
_memoryCache = memoryCache;
return self;
}
初始化方法中在创建缓存时同时创建了YYDiskCache与YYMemoryCache
- (BOOL)containsObjectForKey:(NSString *)key {
return [_memoryCache containsObjectForKey:key] || [_diskCache containsObjectForKey:key];
}
判断是否具有每个缓存时对 YYDiskCache与 YYMemoryCache同时进行判断
- (id<NSCoding>)objectForKey:(NSString *)key {
id<NSCoding> object = [_memoryCache objectForKey:key];
if (!object) {
object = [_diskCache objectForKey:key];
if (object) {
[_memoryCache setObject:object forKey:key];
}
}
return object;
}
读取缓存时先从YYMemoryCache中去读取数据,如果YYMemoryCache中不存在时就从YYDiskCache读取数据,并把数据存放在YYMemoryCache中
由以上方法可以确定,YYCache的操作同时是对YYDiskCache与YYMemoryCache的操作
具体使用方法如下:
1、同步缓存操作
func userYYCache() -> Void {
let cacheName:String = "TongCache"
let cache:YYCache = YYCache.init(name: cacheName)!
let cacheKey:String = "TongCacheKey"
print("开始进行同步存储数据")
cache.setObject("data" as NSCoding, forKey: cacheKey)
sleep(5)
print("同步存储数据结束")
print("开始同步判断是否含有缓存")
let isContent:Bool = cache.containsObject(forKey: cacheKey)
sleep(5)
print("判断缓存是否存在结束")
print("开始读取缓存数据")
let data:String = cache.object(forKey: cacheKey) as! String
sleep(5)
print("读取缓存数据结束")
}
执行结果如下:
开始进行同步存储数据
同步存储数据结束
开始同步判断是否含有缓存
判断缓存是否存在结束
开始读取缓存数据
读取缓存数据结束
block块进行数据操作
func userCacheForAsyn() -> Void {
print("开始进行缓存操作")
let cacheName:String = "YiCache"
let cache:YYCache = YYCache.init(name: cacheName)!
let cacheKey:String = "YiCacheKey"
print("开始进行异步存储数据")
cache.setObject("data" as NSCoding, forKey: cacheKey) {
print("====")
}
sleep(5)
print("异步存储数据结束")
print("开始同步判断是否含有缓存")
cache.containsObject(forKey: cacheKey) { (name, icContent) in
print("name:\(name), icContent:\(icContent)")
}
sleep(3)
print("判断缓存是否存在结束")
print("开始读取缓存数据")
cache.object(forKey: cacheKey) { (name, nSCoding) in
print("name:\(name), coding:\(nSCoding)")
}
sleep(7)
print("读取缓存数据结束")
print("结束缓存操作")
}
执行结果
开始进行缓存操作
开始进行同步存储数据
数据缓存完毕
同步存储数据结束
开始同步判断是否含有缓存
name:YiCacheKey, icContent:true
判断缓存是否存在结束
开始读取缓存数据
name:YiCacheKey, coding:data
读取缓存数据结束
YYKIT系列之 —— YYCache相关推荐
- YYKit系列之——YYCache使用
YYCache类引用 继承自nsobject 中声明yycache.h 概述 YYCache是线程安全的缓存键值. 它使用YYMemoryCache存储对象在一个小而快内存缓存,并使用YYDiskCa ...
- YYKit系列之——YYModel使用(摘自GitHub)
简单的 Model 与 JSON 相互转换 <span style="font-weight: normal;">// JSON: {"uid":1 ...
- 又一个高性能轻量级的iOS模型框架YYModel
前言 iOS的模型框架其实有很多了,去年研究过Mantle,也了解过JSONModel.MJExtension,最近的项目项目优化的时候,再次考虑,基于轻量级.高性能的考虑,最终选择了YYModel. ...
- iOS开发中自旋和互斥锁的理解以及所有锁的性能比较
补充: 可以看到除了 OSSpinLock 外,dispatch_semaphore 和 pthread_mutex 性能是最高的.苹果在新系统中已经优化了 pthread_mutex 的性能,所以它 ...
- YYKit学习系列 ---- 开篇
准备花半年时间系统学习YYKit, 学习过程会放入"YYKit学习系列"这个分类, 喜欢YYKit的可以随时留意我的文章, 一起学习!!! 转载于:https://www.cnb ...
- YYCache 源码学习(一):YYMemoryCache
其实最近是在重新熟练Swift的使用,我想出了一个比较实用的方法,那就是一边看OC的项目,看懂之后用Swift实现一遍.这样既学习了优秀的源码又练习了Swift,一举两得. 之前看过几篇文章是剖析YY ...
- YYCache深入学习
深知,源码还是一点点读,加点读书笔记,才可以深入挖掘,因此还是觉得每次读源码都记录一番,无论好坏,如有写错,请斧正 简介 YYCahce 是作为 ibireme 大神开源的一个YYkit组件库中的一部 ...
- 专访 YYKit 作者 ibireme: 开源大牛是怎样炼成的
前言 第一次听到 ibireme 这个名字,是看到他在 微博上分享 了 YYText 开源库.当时我第一眼见到 YYText 的功能示意 GIF 图时(下图所示),就被它丰富的功能吸引了.YYText ...
- 源码解析--YYCache
前言:准备看下YY系列中的YYWebImage框架,发现该框架是使用YYCache来做缓存的.那就从缓存开始吧. 先奉上YYCache框架的地址以及作者的设计思路 学习YYCache框架你可以get到 ...
最新文章
- APP测试入门之功能测试
- IBM X System ServerGuide 8.41 服务器 系统安装引导盘
- mac下android环境搭建笔记(android studio)
- docker,k8s学习笔记汇总
- Android 安全机制概述
- C语言——判断是该年的第几天
- JQuery中Ajax的Post提交中文乱码的解决方案
- 数据结构练手02 双向链表实现
- Scala 学习之面向对象(3)
- Discuz 3.2x 的那些坑
- JSON转换问题最全详解(json转List,json转对象,json转JSONObject)
- 苹果手机如何上传文件到服务器,有限条件下,如何将IPhone手机照片传到Windows电脑中?...
- GBase8a数据库中表的comment信息
- Excel最强玩法!用Excel做“动态日历表”,让你的好记性更牢固!
- canvas画钟表demo
- VR · AR · MR 与 科幻 (序)
- 补码中关于-32768的问题
- 讯飞翻译机抢镜背后,跨语种沟通迈入全新时代
- 电脑技术员联盟 GhostXp Sp3 装机版V5.1
- 基于PP-ShiTu的商品识别系统