006 [翻译] Haneke(一个Swfit iOS缓存类)
Github项目地址:https://github.com/Haneke/HanekeSwift
Haneke是一个用swift写成的轻量级iOS类,以简单好用著称(design-decisions-behind-haneke-1-0),有多简单呢?
假如你要初始化一个JSON缓存,将目标从URL获取:

let cache = Cache<JSON>(name: "github")
let URL = NSURL(string: "https://api.github.com/users/haneke") cache.fetch(URL: URL).onSuccess { JSON in
println(JSON.dictionary?["bio"])
}

就是这么简单。
Haneke 还提供了内存缓存以及LRU(最少使用算法)闪存缓存,支持的格式有 UIImage, NSData, JSON, String 等等……换句话说,只要是能够读写为 data格式的,就能缓存。
另外,Haneke 非常善于处理图片任务:不需要额外操作就可以自动处理图片大小,这一切都在后台完成,可以让主界面UI更流畅。载入,缩放图片,缓存和显示适配图片仅仅只需要一行代码:
1
|
imageView.hnk_setImageFromURL(url) |
一些特性:
- UIImage, NSData, JSON and String 缓存直接支持
- 一级缓存-内存缓存使用 NSCache
- 二级缓存-闪存缓存使用 LRU 算法写入文件
- 网络操作或者闪存数据获取操作使用异步方式
- 所有闪存相关操作都在后台完成
- 线程安全
- 收到内存警告或者闪存空间不足,自动清理多余缓存
- 经过广泛的用例测试
- 可以通过定义自定义格式扩展,支持其它类型或者进行其它自定义获取操作
尤其对于images来说:
- 不需要配置 UIImageView和 UIButton即可使用缓存,针对 UITableView和 UICollectionView的 cell重用进行过性能优化。
- 后台图片处理(解、压缩)
- iOS 8.0+
- Xcode 6.0
要求是iOS 8.0以及以上可能比较苛刻,因为苹果刚刚公布的数据是iOS8占有率还是只有48%,不过如果是全新的项目,那完全可以关注一下Haneke。
集成到项目中:
Haneke 打包成了 Swift 框架. 目前最简单的引入方法
- 将 Haneke.xcodeproj 拖至你的项目中.
- 选中的项目Target. 找到Build Phases .
- 展开, 加入 Haneke.framework.
- 点击 + ,然后选择 New Copy Files Phase.添加 Haneke.framework.
- import Haneke .
使用缓存:
Haneke 提供用于 UIImage, NSData, JSON 和String 的shared cache.你也可以创建你自己的缓存对象。
缓存以 key-value 进行.举个例子, 保存缓存然后重新获取:

let cache = Haneke.sharedDataCache cache.set(value: data, key: "funny-games.mp4") // 然后... cache.fetch(key: "funny-games.mp4").onSuccess { data in
// data相关的操作可以在这里进行 }

在多数情况下,我们总是要去网络或者闪存重新读取值,但是Haneke提供了简便的获取方法,回到第一个例子,这次使用shared cache:

let cache = Haneke.sharedJSONCache
let URL = NSURL(string: "https://api.github.com/users/haneke") cache.fetch(URL: URL).onSuccess { JSON in
println(JSON.dictionary?["bio"])
}

这次请求先会尝试从内存缓存中读取、然后是闪存和NSURLCache,假如没有找到数据,那Haneke 会重新获取网络数据然后进行缓存,在这个栗子中,URL 本身作为一个key保存。更多自定义的操作可以参考 formats, supporting additional types 或 implementingcustom fetchers.
♡ 更多对于 images的支持
针对图片的展示,Haneke 提供对UIImageView 、UIButton以及UITableView 和UICollectionView cell 重用时候的更多优化和简便方法。图片可以很好地被压缩和存储在缓存中。
// 设置一张网络图片
imageView.hnk_setImageFromURL(url) // 手动设置一张图片. 需要自定义key名.
imageView.hnk_setImage(image, key: key)
以上代码:
- 假如缓存成功,会在缓存(内存或者闪存中)得到一张适当大小的图片(和UIImageView的 bounds以及contenMode有关),这一切都是后台进行的,所以不会卡,嗯。
- 假如没有被缓存过,从目标位置获取图片以后会进行压缩产生一张合适大小的图片,也是在后台进行,加入在NSURLCache中能找到,那么从NSURLCache中获取。
- 设置图片,同时附带动画效果。
- 假如UIImageViewv正在以上操作中被重用,那不会进行操作。
- 缓存操作之后的image
- 假如有必要,会清理缓存中最少使用的图片。
Formats
Formats 允许在检查闪存缓存的大小和所有缓存之前的变化,再举一个栗子,UIImageView extension 用一个format 来放缩图片大小来得到适当的image。
你也可以自定义Formats ,比如你想将磁盘缓存大小限制到10MB或者给图片加上圆角:

let cache = Haneke.sharedImageCache let iconFormat = Format<UIImage>(name: "icons", diskCapacity: 10 * 1024 * 1024) { image in
return imageByRoundingCornersOfImage(image)
}
cache.addFormat(iconFormat) let URL = NSURL(string: "http://haneke.io/icon.png")
cache.fetch(URL: URL, formatName: "icons").onSuccess { image in
// 图片变圆角了… }

我们只需要告诉Haneke 我们需要 "icons" 格式,那Haneke就会在后台帮我们搞定,我们只需要等待结果。
Formats 也可以用在 UIKit extensions:
imageView.hnk_setImageFromURL(url, format: iconFormat)
Fetchers
根据urls或者paths的获取方法相当的简便,网络获取举例:
1
2
3
4
5
|
let fetcher = NetworkFetcher<UIImage>(URL: URL) cache.fetch(fetcher: fetcher).onSuccess { image in // 这里可以对image做些什么.. } |
从网络或者闪存中获取原始数据的代价往往比较高,Fetchers就像一个代理一样,只会在Haneke真正需要的时候才发起获取操作。另外,fetcher 如果是从网络中获取数据的,那么fetcher 会将获取后的数据缓存起来。
自定义fetchers
Haneke 提供了两个特殊的fetchers:NetworkFetcher<T> and DiskFetcher<T>.你也可以通过继承fetchers<T>来自定义fetchers 。通过自定义fetchers ,你可以从网络和闪存之外的另外一些数据源中获取数据(比如 Core Data)。你甚至可以自定义 Haneke 访问网络或者闪存的方式,比如,用 Alamofire (类似于obj-c中的AFNetworking)来替代NSURLSession。一个自定义的 fetcer 必须继承自Fetcher<T> ,满足以下条件:
- 提供key值 (比如 NetworkFetcher中的NSURL.absoluteString) ,然后关联将要获取的数据
- 在后台进行获取操作,然后在主线程中提供成功或失败后的closure(闭包:类似于obj-c中的block)。
- 根据需求取消获取操作,假如可以的话。
Fetchers 是泛型,所以对它的唯一限制是它必须符合类型匹配(DataConvertible)。只要数据能够存为 data,那Haneke 就可以缓存它。具体需要遵循DataConvertible 和DataRepresentable协议:

public protocol DataConvertible {
typealias Result class func convertFromData(data:NSData) -> Result? } public protocol DataRepresentable { func asData() -> NSData! }

假如想让 NSDictionary 增加缓存支持:

extension NSDictionary : DataConvertible, DataRepresentable { public typealias Result = NSDictionary public class func convertFromData(data:NSData) -> Result? {
return NSKeyedUnarchiver.unarchiveObjectWithData(data) as? NSDictionary
} public func asData() -> NSData! {
return NSKeyedArchiver.archivedDataWithRootObject(self)
} }

之后,缓存 NSDictionary 就很容易了:
let cache = Cache<NSDictionary>(name: "dictionaries")
项目进展:
Haneke Swift 是一个正在进行中的项目, 它的API现在还并不非常稳定.
http://www.cnblogs.com/dikey/p/4037182.html
006 [翻译] Haneke(一个Swfit iOS缓存类)的更多相关文章
- iOS缓存类的设计
使用执行速度缓存的程序可以大大提高程序,设计一个简单的缓存类并不需要太复杂的逻辑. 只需要一个简单的3接口. 存款对象 以一个对象 删除对象 阅读对象 watermark/2/text/aHR0cDo ...
- PHP原生:分享一个轻量级的缓存类=>cache.php
适用:原生PHP cache.php tips:代码最后有适用Demo哦. <?php /* * 缓存类 cache */ define("cacheRoot"," ...
- iOS NSCache缓存类的了解
前言: 最近面试时,问到了限定并发数的视频下载,当时回答的时通过GCD_barrier 处理,回来想想也可以通过NSCache处理,所以顺便复习一下,这个知识点. 一,关于NSCache说明 说明 ...
- 一个不错的PHP文件页面缓存类
在php中缓存分类数据库缓存,文件缓存和内存缓存,下面我来给各位同学详细介绍PHP文件缓存类实现代码,有需要了解的朋友可参考. 页面缓存类 <?php /* * 缓存类 cac ...
- 比较全面的一个PHP缓存类解析
转自:http://www.blhere.com/1164.html 一.引论 PHP,一门最近几年兴起的web设计脚本语言,由于它的强大和可伸缩性,近几年来得到长足的发展,php相比传统的asp网站 ...
- 一位iOS教育类应用开发者是如何赚到60多万美元?
注:伯乐在线12月19日在@程序员的那些事 微博推荐了此文的英文原文,非常感谢@dotSlash 的翻译. 转眼距我写<我如何在iOS教育类应用中赚到20万美元>这篇博文已经一年多了,它 ...
- iOS缓存框架-PINCache解读
文/Amin706(简书作者)原文链接:http://www.jianshu.com/p/4df5aad0cbd4著作权归作者所有,转载请联系作者获得授权,并标注“简书作者”. 在项目中总是需要缓存一 ...
- 如何设置一个App的缓存机制
在手机应用程序开发中,为了减少与服务端的交互次数,加快用户的响应速度,一般都会在iOS设备中加一个缓存的机制,前面一篇文章介绍了iOS设备的内存缓存,这篇文章将设计一个本地缓存的机制. 功能需求 这个 ...
- ASP.NET Core 折腾笔记二:自己写个完整的Cache缓存类来支持.NET Core
背景: 1:.NET Core 已经没System.Web,也木有了HttpRuntime.Cache,因此,该空间下Cache也木有了. 2:.NET Core 有新的Memory Cache提供, ...
随机推荐
- Codeforces 699
Problem A Launch of Collider 题目大意 在x轴上有n个点,坐标均为偶数.每个点或向左移动或向右移动,每秒移动距离为1. 使所有点同时开始移动,求最早有点相遇的时间或无解. ...
- BZOJ 3531(树链剖分+线段树)
Problem 旅行 (BZOJ 3531) 题目大意 给定一颗树,树上的每个点有两个权值(x,y). 要求维护4种操作: 操作1:更改某个点的权值x. 操作2:更改某个点的权值y. 操作3:求a-- ...
- 一、什么是WPF?
一.什么是WPF? Windows Presentation Foundation(以前的代号为“Avalon”)是 Microsoft 用于 Windows 的统一显示子系统,它通过 WinFX 公 ...
- 七、CCScene
CCScene一般情况是游戏里面的根节点,称之为"场景",运行游戏时需要通过CCDirector启动第一个场景.当然,游戏稍微复杂一点的话,可能会包含很多个场景,这就涉及到场景的切 ...
- JDBC接口规范
前言 JDBC(JavaDatabase Connectivity)表示Java查询引擎连接,由一组用Java编程语言编写的类和接口组成.JDBC为Java程序访问关系型查询引擎提供了编程接口,为查询 ...
- Canvas 获取颜色值
Canvas 是 HTML5 的画布元素,按照像素绘制图像.有时需要用户点击鼠标的时候获取像素值. 获取画布元素 var canvas = document.getElementById(" ...
- 新款F系列虚拟机
我们宣布,10款全新的优化版虚拟机今天正式面市.这款名为"F系列"的全新虚拟机,基于因特尔2.4 千兆赫Xeon® E5-2673 v3(Haswell)处理器:采用因特尔睿频加速 ...
- USB协议-检测设备连接与速度
在USB设备连接时,USB系统能自动检测到这个连接,并识别出其采用的数据传输速率.USB采用在D+或D-线上增加上拉电阻的方法来识别低速和全速设备. USB支持3种类型的传输速率:1.5Mb/s的低速 ...
- IE6无法加载CSS
问题:写了个页面,IE7和IE8下正常,但发现IE6下竟然没有加载css样式. 找原因,发现是因为CSS文件的编码不正确,页面是采用utf-8编码的,但样式表是复制过来的,编码是ANSI,这种情况下在 ...
- 这是高手最常用的第一快捷组合键 - imsoft.cnblogs
1.锁定电脑 2.要找电脑上的文件时,一般人会先找到“我的电脑”,然后点击打开,而高手总是很酷的,轻轻按下键盘上的Windows键不放然后再按E键,直接打开电脑的资源管理器,而一般人还在慢慢寻找“我的 ...