swift - YYCache 之 YYDiskCache
YYDiskCache缓存是通过file文件,splits进行数据存储与读取操作,直接放代码
初始化方法:
- (nullable instancetype)initWithPath:(NSString *)path;
- (nullable instancetype)initWithPath:(NSString *)path
inlineThreshold:(NSUInteger)threshold
我们看两个方法的实现:
- (instancetype)initWithPath:(NSString *)path {
return [self initWithPath:path inlineThreshold:1024 * 20]; // 20KB
}
- (instancetype)initWithPath:(NSString *)path
inlineThreshold:(NSUInteger)threshold {
self = [super init];
if (!self) return nil;
YYDiskCache *globalCache = _YYDiskCacheGetGlobal(path);
if (globalCache) return globalCache;
YYKVStorageType type;
if (threshold == 0) {
type = YYKVStorageTypeFile;
} else if (threshold == NSUIntegerMax) {
type = YYKVStorageTypeSQLite;
} else {
type = YYKVStorageTypeMixed;
}
YYKVStorage *kv = [[YYKVStorage alloc] initWithPath:path type:type];
if (!kv) return nil;
_kv = kv;
_path = path;
_lock = dispatch_semaphore_create(1);
_queue = dispatch_queue_create("com.ibireme.cache.disk", DISPATCH_QUEUE_CONCURRENT);
_inlineThreshold = threshold;
_countLimit = NSUIntegerMax;
_costLimit = NSUIntegerMax;
_ageLimit = DBL_MAX;
_freeDiskSpaceLimit = 0;
_autoTrimInterval = 60;
[self _trimRecursively];
_YYDiskCacheSetGlobal(self);
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(_appWillBeTerminated) name:UIApplicationWillTerminateNotification object:nil];
return self;
}
由上可见 initWithPath:方法是调用initWithPath:inlineThreshold:方法创建的disk缓存,disk缓存存在三种缓存策略YYKVStorageTypeFile文件缓存、YYKVStorageTypeSQLite数据库缓存、YYKVStorageTypeMixed混合缓存
- (instancetype)initWithPath:(NSString *)path创建的是默认20KB的混合缓存策略。缓存策略下一个小节去讲述概括
常用的属性:
@property (nullable, copy) NSString *name; // 缓存的名字
@property (readonly) NSString *path;//缓存的位置
@property (readonly) NSUInteger inlineThreshold; //缓存的临界数值用于缓存类型
@property (nullable, copy) NSData *(^customArchiveBlock)(id object); // 块方法归档数据
@property (nullable, copy) id (^customUnarchiveBlock)(NSData *data);// 块方法解归档数据
@property (nullable, copy) NSString *(^customFileNameBlock)(NSString *key); // 自定义文件设置文件名
/*disk缓存操作方法*/
/*是否含有缓存*/
- (BOOL)containsObjectForKey:(NSString *)key;
- (void)containsObjectForKey:(NSString *)key withBlock:(void(^)(NSString *key, BOOL contains))block;
/*获取缓存*/
- (nullable id<NSCoding>)objectForKey:(NSString *)key;
- (void)objectForKey:(NSString *)key withBlock:(void(^)(NSString *key, id<NSCoding> _Nullable object))block;
/*设置缓存*/
- (void)setObject:(nullable id<NSCoding>)object forKey:(NSString *)key;
- (void)setObject:(nullable id<NSCoding>)object forKey:(NSString *)key withBlock:(void(^)(void))block;
/*移除缓存*/
- (void)removeObjectForKey:(NSString *)key;
- (void)removeObjectForKey:(NSString *)key withBlock:(void(^)(NSString *key))block;
- (void)removeAllObjectsWithBlock:(void(^)(void))block;
- (void)removeAllObjectsWithProgressBlock:(nullable void(^)(int removedCount, int totalCount))progress
endBlock:(nullable void(^)(BOOL error))end;
- (void)removeAllObjects;
/*缓存数量*/
- (NSInteger)totalCount;
- (void)totalCountWithBlock:(void(^)(NSInteger totalCount))block;
/*缓存大小*/
- (NSInteger)totalCost;
- (void)totalCostWithBlock:(void(^)(NSInteger totalCost))block;
/*LRU缓存清除*/后期介绍
- (void)trimToCount:(NSUInteger)count;
- (void)trimToCount:(NSUInteger)count withBlock:(void(^)(void))block;
- (void)trimToCost:(NSUInteger)cost;
- (void)trimToCost:(NSUInteger)cost withBlock:(void(^)(void))block;
- (void)trimToAge:(NSTimeInterval)age;
- (void)trimToAge:(NSTimeInterval)age withBlock:(void(^)(void))block;
/*存取对象的扩展数据*/
+ (nullable NSData *)getExtendedDataFromObject:(id)object;
+ (void)setExtendedData:(nullable NSData *)extendedData toObject:(id)object;
使用方法:
func userDiskCache() -> Void {
var diskPath = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true).first!
diskPath += "/DiskCache"
// 创建默认为20KB的缓存,创建缓存的策略是file于SQlit混合使用
let diskCache:YYDiskCache = YYDiskCache.init(path: diskPath)!
diskCache.name = "DiskCacheName"
/*进行数据缓存*/
diskCache.setObject("你好" as NSCoding, forKey: "DiskCacheKey")
/*判断数据缓存*/
let isContent:Bool = diskCache.containsObject(forKey: "DiskCacheKey")
print("isContent:\(isContent)")
/*读取缓存数据*/
let data:String = diskCache.object(forKey: "DiskCacheKey") as! String
print("data:\(data)")
/*获取缓存的数量*/
let cacheCount:Int = diskCache.totalCount()
print("cacheCount:\(cacheCount)")
/*获取缓存的大小*/
let cacheSize:Int = diskCache.totalCost()
print("缓存的总体成本cacheSize:\(cacheSize)B")
}
swift - YYCache 之 YYDiskCache相关推荐
- iOS—缓存YYCache框架
下载地址 :点击打开链接 一.简介: 计算上的的cache 就是高速缓存,计算机组成课程里的定义是,存在于主存和cpu之间,主要用于解决CPU处理数据的速度远远大于读取主存数据的速度. 手机上也有ca ...
- YYKIT系列之 —— YYCache
YYCache是一个优秀的缓存框架,其文件结构如下: YYCache的文件结构分为四个,YYCAche.YYDiskCache.YYKVStorage.YYMemoryCache YYCAche使用以 ...
- 深入理解YYCache缓存策略
文章目录 前言 几个主要成员类 1 YYCache 2 YYMemoryCache 3 YYDiskCache 实例化 1 实例方法 2 构造器方法 查 1 检查是否有缓存 2 读缓存 增 1 写内存 ...
- YYCache 源码解析
YYCache 源码解析 YYCache是国内开发者ibireme开源的一个线程安全的高性能缓存组件,代码风格简洁清晰,在GitHub上已经有了1600+颗星. 阅读它的源码有助于建立比较完整的缓存设 ...
- 如何使用YYCache存储自定义对象
YYCache是一个缓存框架,由YYCache.YYDiskCache.YYMemoryCache和YYKVStorage组成.在项目开发过程中,想通过YYCache存储一个自定义对象,这个对象包括文 ...
- iOS开发 数据存储之YYCache
一.关于YYCache YYCache由YYCache.YYDiskCache.YYMemoryCache和YYKVStorage组成,其中YYKVStorage可直接对sqlite和文件系统进行读写 ...
- YYCache源码解读 (一)
YYCache YYCache是 ibireme 大神在2015年设计的一个IOS缓存工具. 通常来讲,一个缓存包括内存缓存和磁盘缓存.YYCache在磁盘缓存的设计上使用数据库sqlite映 ...
- YYCache 源码学习(二):YYDiskCache
整体思路 从作者的<YYCache 设计思路>一文中可以看出,作者在设计YYDiskCache之前做了充分的测试:iPhone 6 64G 下,SQLite 写入性能比直接写文件要高,但读 ...
- YYCache 源码学习(一):YYMemoryCache
其实最近是在重新熟练Swift的使用,我想出了一个比较实用的方法,那就是一边看OC的项目,看懂之后用Swift实现一遍.这样既学习了优秀的源码又练习了Swift,一举两得. 之前看过几篇文章是剖析YY ...
最新文章
- 京东商城背后的AI技术能力揭秘 - 基于关键词自动生成摘要
- IBM Rational DOORS通过DXL进行二次开发初试(2)
- WinForm界面设计优化过程
- c++中std::set自定义去重和排序函数
- Leetcode 950. Reveal Cards In Increasing Order
- hive实现根据用户分组,按用户记录求上下两条记录的时间差
- 使用Aop管理所有Valid结构bindingResult
- 我的高拍仪自动阅卷系统
- 张鑫旭的《CSS世界》读后笔记
- android dagger2 讲解,用Dagger2在Android中实现依赖注入
- Spark/Flink/CarbonData技术实践最佳案例解析
- 几何均数怎样用计算机算,算术均数与几何均数的意义及计算方法
- java实现猜你喜欢_猜你喜欢实现原理:电商“猜你喜欢“是怎么实现的?
- 1. Boost.Asio入门
- 【Hive】Hive锁机制分析及任务问题处理
- 读书笔记-指数基金投资指南
- mac os 触摸屏_为什么没有出现触摸屏Mac
- 操作系统对计算机组件的抽象概念表示
- 什么品牌的蓝牙耳机音质好?四款高音质蓝牙耳机推荐
- 新版标准日本语中级_第十一课
热门文章
- 网页中插入视频播放,音频播放,自动验证输入框格式
- 科大讯飞发布四川话语音识别技术,号称识别准确率超过85%
- 让你的网站打开的更快
- 如何在群晖NAS中使用frp进行内网穿透
- 堡垒机jumperserver搭建以及监控资源使用
- C/C++:sizeof数组与指针
- python123自定义幂函数_《python语言程序设计》_第三章(数字函数、字符串和对象)...
- node.js爬虫之下载图片,批量下载图片,控制下载图片并行上限
- 刀塔传奇-王信文 分享总结
- freemarker 应用模板导出Execle(解决生成弹出版本不适合)