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相关推荐

  1. YYKit系列之——YYCache使用

    YYCache类引用 继承自nsobject 中声明yycache.h 概述 YYCache是线程安全的缓存键值. 它使用YYMemoryCache存储对象在一个小而快内存缓存,并使用YYDiskCa ...

  2. YYKit系列之——YYModel使用(摘自GitHub)

    简单的 Model 与 JSON 相互转换 <span style="font-weight: normal;">// JSON: {"uid":1 ...

  3. 又一个高性能轻量级的iOS模型框架YYModel

    前言 iOS的模型框架其实有很多了,去年研究过Mantle,也了解过JSONModel.MJExtension,最近的项目项目优化的时候,再次考虑,基于轻量级.高性能的考虑,最终选择了YYModel. ...

  4. iOS开发中自旋和互斥锁的理解以及所有锁的性能比较

    补充: 可以看到除了 OSSpinLock 外,dispatch_semaphore 和 pthread_mutex 性能是最高的.苹果在新系统中已经优化了 pthread_mutex 的性能,所以它 ...

  5. YYKit学习系列 ---- 开篇

    准备花半年时间系统学习YYKit,  学习过程会放入"YYKit学习系列"这个分类, 喜欢YYKit的可以随时留意我的文章, 一起学习!!! 转载于:https://www.cnb ...

  6. YYCache 源码学习(一):YYMemoryCache

    其实最近是在重新熟练Swift的使用,我想出了一个比较实用的方法,那就是一边看OC的项目,看懂之后用Swift实现一遍.这样既学习了优秀的源码又练习了Swift,一举两得. 之前看过几篇文章是剖析YY ...

  7. YYCache深入学习

    深知,源码还是一点点读,加点读书笔记,才可以深入挖掘,因此还是觉得每次读源码都记录一番,无论好坏,如有写错,请斧正 简介 YYCahce 是作为 ibireme 大神开源的一个YYkit组件库中的一部 ...

  8. 专访 YYKit 作者 ibireme: 开源大牛是怎样炼成的

    前言 第一次听到 ibireme 这个名字,是看到他在 微博上分享 了 YYText 开源库.当时我第一眼见到 YYText 的功能示意 GIF 图时(下图所示),就被它丰富的功能吸引了.YYText ...

  9. 源码解析--YYCache

    前言:准备看下YY系列中的YYWebImage框架,发现该框架是使用YYCache来做缓存的.那就从缓存开始吧. 先奉上YYCache框架的地址以及作者的设计思路 学习YYCache框架你可以get到 ...

最新文章

  1. APP测试入门之功能测试
  2. IBM X System ServerGuide 8.41 服务器 系统安装引导盘
  3. mac下android环境搭建笔记(android studio)
  4. docker,k8s学习笔记汇总
  5. Android 安全机制概述
  6. C语言——判断是该年的第几天
  7. JQuery中Ajax的Post提交中文乱码的解决方案
  8. 数据结构练手02 双向链表实现
  9. Scala 学习之面向对象(3)
  10. Discuz 3.2x 的那些坑
  11. JSON转换问题最全详解(json转List,json转对象,json转JSONObject)
  12. 苹果手机如何上传文件到服务器,有限条件下,如何将IPhone手机照片传到Windows电脑中?...
  13. GBase8a数据库中表的comment信息
  14. Excel最强玩法!用Excel做“动态日历表”,让你的好记性更牢固!
  15. canvas画钟表demo
  16. VR · AR · MR 与 科幻 (序)
  17. 补码中关于-32768的问题
  18. 讯飞翻译机抢镜背后,跨语种沟通迈入全新时代
  19. 电脑技术员联盟 GhostXp Sp3 装机版V5.1
  20. 基于PP-ShiTu的商品识别系统

热门文章

  1. 线性代数Python计算:Python数系
  2. 白板上的记号笔字迹如何去除?
  3. wampserver黄色:80端口被占用
  4. GitHub 注册失败的原因 以及解决 。
  5. android 2d瓷砖地形,2D游戏地图地表生成技术.pdf
  6. 通过LWIP 的RAW API 进行与服务器的UDP通信(stm32 f103 -- enc28j60)
  7. 什么是存储引擎以及MySQL常见的三种数据库存储引擎
  8. 大连理工大学计算机原理实验报告,大连理工大学计算机原理实验报告.pdf
  9. Laravel 关联关系
  10. flowable工作流-BPMN流程部署