惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

博客园 - 司徒正美
T
The Blog of Author Tim Ferriss
雷峰网
雷峰网
S
Secure Thoughts
GbyAI
GbyAI
Google DeepMind News
Google DeepMind News
P
Proofpoint News Feed
G
GRAHAM CLULEY
MongoDB | Blog
MongoDB | Blog
WordPress大学
WordPress大学
M
MIT News - Artificial intelligence
Martin Fowler
Martin Fowler
C
Cyber Attacks, Cyber Crime and Cyber Security
I
Intezer
A
About on SuperTechFans
Hugging Face - Blog
Hugging Face - Blog
T
Threatpost
S
Securelist
T
Tenable Blog
博客园_首页
P
Privacy International News Feed
Cisco Talos Blog
Cisco Talos Blog
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
月光博客
月光博客
C
CXSECURITY Database RSS Feed - CXSecurity.com
小众软件
小众软件
美团技术团队
Project Zero
Project Zero
The Cloudflare Blog
L
Lohrmann on Cybersecurity
The Register - Security
The Register - Security
B
Blog
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
L
LINUX DO - 热门话题
C
CERT Recently Published Vulnerability Notes
C
Cybersecurity and Infrastructure Security Agency CISA
有赞技术团队
有赞技术团队
IT之家
IT之家
A
Arctic Wolf
Scott Helme
Scott Helme
Latest news
Latest news
T
Tailwind CSS Blog
Jina AI
Jina AI
Microsoft Azure Blog
Microsoft Azure Blog
Recent Announcements
Recent Announcements
Cyberwarzone
Cyberwarzone
宝玉的分享
宝玉的分享
The Hacker News
The Hacker News
S
Schneier on Security
Y
Y Combinator Blog

isaced

使用 TypeScript 构建的 appstore-connect-sdk 归档 我用 SwiftUI 写了一个 V2ex 客户端 Docker 容器化多应用部署 Swift Server-side SDWebImage 为什么无法读取 webpmux 生成的 WebP 动图? [译] 探索 Swift 4 中新的 String API 对一个 Django 站点做 ab 压力测试 fir-mac 开发笔记 iOS10 Safari 引导用户信任企业签名 Swift Web 开发之 Vapor - 模版 Leaf(三) Swift Web 开发之 Vapor - 路由(二) HoloLens 初体验 Swift Web 开发之 Vapor - 入门(一) Jenkins for iOS 搭建日记 iOS HOOK 注入与重签名 Xcode 使用 Configuration 来配置不同的项目环境 图床从SAE迁移到七牛 给 UIProgressView 脱掉那层微弱的渐变 初用 CocoaAsyncSocket 记一次 SQLite 性能优化 有多色 - 开发小记 海岛风情 - 泰国普吉岛六日游 日语五十音假名临摹校验算法 [iOS] UITextView 追加文字自动跳到顶部解决方法 Cocoa 新的依赖管理工具:Carthage 新年快乐! 博客主机换到搬瓦工 写了个iOS小游戏:有多色 iOS 后台任务之 Long-running background task 悄悄的就必须用 XCode 5.1.1 上传了! HTTP Content-type 与 AFNetworking Objective-Cloud 初体验(1) 掌中站上架小记 NSLoger 上线了 Python Markdown 做语法限制 Nginx + Gunicorn + Django 部署小记 用Shell脚本批量裁剪App Icon各个尺寸 LaunchRocket使用小记 用宏提速NSCoding 2014新年伊始:近期读过的好文推荐 [iOS] stringWithFormat 和 initWithFormat 有何不同? Apache + Flask + mod_wsgi + Koding 部署小记 收集几个Objective-C的HTML解析库 NSMapTable: 不只是一个能放weak指针的 NSDictionary 2013,再见! Emlog到Typecho的迁移工具:emlog2typecho [iOS]给上拉下拉刷新PullToRefresh做本地化 [iOS]代码推荐:大图缩放视图 - Vertigo iOS:hidesBottomBarWhenPushed的正确用法 Xcode 5新的Interface Builder,你准备好了吗? [翻译]如何使用Django创建简单的博客 我的Mac音乐播放器 初识 NSDataDetector Objective-C 计算代码运行时间 WordPress上传文件自动重命名 iOS:仿jing.fm的音乐播放视图 我的啃黑苹果之路 关于 搜索 项目
EGOCache 源码解析
2015-04-22 · via isaced

今天说说一款叫 EGOCache 的开源项目,一个简单、线程安全的基于 key-value 的缓存框架,原生支持 NSStringUI/NSImage、和 NSData,也支持储存任何实现 <NSCoding> 协议的类,可以设定缓存过期时间,默认是 1 天;ARC、基于 Block,同时支持 iOS 和 OSX 平台。

Fast Caching for Objective-C (iPhone & Mac Compatible)

EGOCache 是 Enormego 团队的开源作品,Enormego 在 Github 上贡献了众多开源项目,大家很可能用过 EGOTableViewPullRefresh ,它就是出自 Enormego 之手,可不知为何 EGOTableViewPullRefresh 在两年前就已经停止了更新;不过不用担心,今天本文所说的 EGOCache 还在保持着更新。

结构分析

EGOCache 保持很轻盈的体积,只有一个类,包括 EGOCache.hEGOCache.m 两个文件,和最基本的操作,也很方便我们学习。

分区

提供了一个缓存分区的概念(姑且叫分区吧),可对复杂的项目进行缓存分区,基于文件的各个分区的缓存各不受影响,一个 EGOCache 实例就对应一个分区。可以让稍复杂的应用场景对不同的数据进行分类缓存,便于管理和统计。

建立分区

如果想要新建一个分区,可以使用 initWithCacheDirectory: 构造方法指定一个缓存目录来创建一个 EGOCache 实例,如果分区已存在,则会直接使用。

全局分区

EGOCache 贴心地提供了一个全局 EGOcache 单例,也就是一个默认分区,方便一些简单情况下的快速使用。调用 globalCache 实例方法就能获取到一个单例实例,就是所提供的默认缓存分区。

储存方式

EGOCache 采用磁盘储存方式缓存所有数据,且并没有提供内存缓存,所以如果你需要频繁读取某些缓存,为了加快读取速度和磁盘开销还是建议自己在内存中缓存一下。

上文说到分区的概念,每一个分区就对应一个 EGOcache 实例,同时对应一个 缓存目录,目录中就包含唯一一个 .plist 文件,这个 plist 文件中就存放了缓存文件对应的 key 和该项的 过期时间,所以每个缓存目录结构大致如下:

MyCache
	MyCache.plist
	_abc
	_def

过期

每缓存一个项,都可以单独为其设定一个过期时间,那检查这个过期时间并做删除操作的事件是在哪里触发的呢?

经过对源码的翻阅,在 initWithCacheDirectory: 方法里,即每次初始化实例对象的时候会扫描一遍 plist 文件中记录的所有已存在的缓存项,并和当前时间作比较,过期时间早于了当前时间则删除对应缓存文件,并删除 plist 文件中对应 key 的记录。

线程

大量使用了基于 GCD 的异步操作,在 EGOCache 类的构造中为每个实例维护了 3 个 GCD 队列:

dispatch_queue_t _cacheInfoQueue;
dispatch_queue_t _frozenCacheInfoQueue;
dispatch_queue_t _diskQueue;

从名字即可看到不同的队列对应不同的缓存相关操作,为了互不冲突。

安装

已加入 Cocoapods 豪华午餐,即刻享用:

尾言

其实我在很早,几年前就用过这个开源库,当时被吸引的就是极为简单的操作方法,闲逛之下看到如今还保持着活跃更新,不久前又增加了需要支持 Swift 的 nonnull__nullable 关键字,于是便写下一点点对此项目的一点理解。

如文有误,还望指正!