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 框架. 目前最简单的引入方法

      1. 将 Haneke.xcodeproj 拖至你的项目中.
      2. 选中的项目Target. 找到Build Phases .
      3. 展开, 加入 Haneke.framework.
      4. 点击 + ,然后选择 New Copy Files Phase.添加 Haneke.framework.
      1. 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保存。更多自定义的操作可以参考 formatssupporting additional types 或 implementingcustom fetchers.

? 更多对于 images的支持

针对图片的展示,Haneke 提供对UIImageView 、UIButton以及UITableView 和UICollectionView cell 重用时候的更多优化和简便方法。图片可以很好地被压缩和存储在缓存中。

// 设置一张网络图片
imageView.hnk_setImageFromURL(url)

// 手动设置一张图片. 需要自定义key名.
imageView.hnk_setImage(image, key: key)

以上代码:

      1. 假如缓存成功,会在缓存(内存或者闪存中)得到一张适当大小的图片(和UIImageView的 bounds以及contenMode有关),这一切都是后台进行的,所以不会卡,嗯。
      2. 假如没有被缓存过,从目标位置获取图片以后会进行压缩产生一张合适大小的图片,也是在后台进行,加入在NSURLCache中能找到,那么从NSURLCache中获取。
      3. 设置图片,同时附带动画效果。
      4. 假如UIImageViewv正在以上操作中被重用,那不会进行操作。
      5. 缓存操作之后的image
      6. 假如有必要,会清理缓存中最少使用的图片。

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 URL = NSURL(string: "http://haneke.io/icon.png")

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

时间: 2024-10-15 11:38:15

006 [翻译] Haneke(一个Swfit iOS缓存类)的相关文章

iOS缓存类的设计

使用执行速度缓存的程序可以大大提高程序,设计一个简单的缓存类并不需要太复杂的逻辑. 只需要一个简单的3接口. 存款对象 以一个对象 删除对象 阅读对象 watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdXh5aGVhdmVu/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" > 读取对象的时候先读内存 内存没有就读文件 保存对象 保存对象的时候前台

转 一个弱引用缓存类

在优化性能时,经常会使用到缓存类..NET Framework在System.Web.dll中,提供了一个Cache类.它在Web开发中非常有用,但是如果是WinForm开发,它就用不上了.  在.NET中,由于垃圾回收机制的存在,使得开发人员不用关心内存的分配.不用的对象GC会自动当成垃圾回收.如果能将这些垃圾废品利用的话,很容易节约开销,提升性能.下面提供一个WeakReferenceCachePool<TKey, TItem>类: using System;using System.Co

设计一个字节数组缓存类

转 http://blog.csdn.net/kakashi8841/article/details/42025367 版权所有,转载须注明出处! 1.为什么要 在做网络通信的时候,经常需要用到: 读:就是我们需要从网络流里面读取字节数据,并且由于分包的原因,我们需要自己缓存这些数据,而不是读完立刻丢掉. 写:我们需要把各种类型的数据变成字节写入.比如把int.string.short等变成字节数组写入流. 2.需要什么 我们需要设计一个类来实现: 支持可以不停地往这个类中添加字节 支持写入in

一个不错的PHP文件页面缓存类

在php中缓存分类数据库缓存,文件缓存和内存缓存,下面我来给各位同学详细介绍PHP文件缓存类实现代码,有需要了解的朋友可参考. 页面缓存类  代码如下 复制代码 <?php    /*    * 缓存类    cache   * 作    者:多菜鸟   * 实    例:   */   /*include( "cache.php" );       $cache = new cache(30);   $cache->cacheCheck();       echo dat

自己实现的一个 .net 缓存类(原创)

public class CacheContainer { private static Hashtable ht = new Hashtable(); /// <summary> /// objId :缓存id,objObject:缓存对象,expires:绝对过期时间 /// </summary> /// <param name="objId"></param> /// <param name="objObject&q

比较全面的一个PHP缓存类解析

转自:http://www.blhere.com/1164.html 一.引论 PHP,一门最近几年兴起的web设计脚本语言,由于它的强大和可伸缩性,近几年来得到长足的发展,php相比传统的asp网站,在速度上有绝对的优势,想mssql转6万条数据php如需要40秒,asp不下2分钟.但是,由于网站的数据越来越多,我们渴求能更快速的调用数据,不必要每次都从数据库掉,我们可以从其他的地方,比方一个文件,或者某个内存地址,这就是php的缓存技术,也就是Cache技术. 二.分析深入 一般来说,缓存的

第十一篇 自定义一个缓存类(甚用~)

1 //自定义缓存类 2 public class CacheHelper<T> where T:class 3 { 4 private class Entity 5 { 6 public T Value{get;set;} 7 public DateTime Expiretime { get; set; } 8 } 9 private static readonly Dictionary<string, Entity> Dic=new Dictionary<string,E

ios系类教程之用instruments来检验你的app

ios系类教程之用instruments来检验你的app 为了节省大家的时间,提供一个演示的Demo给大家.代码传送门.下载后解压然后用xcode打开.编译运行APP后 然后在搜索框内输入任意词汇,点击结果你会看到下面的结果 正如你所见的,这个app很简单.程序其实调用的是Flickr的API,通过app顶部的搜索框执行搜索后在下面的tableview显示你搜索的搜索词,搜索词后面的括号内有搜索结果的个数,点击此行进入一个略所图的结果列表页面 如上图. 点击其中一行 进入图像的大图模式,在这个页

一位iOS教育类应用开发者是如何赚到60多万美元?

注:伯乐在线12月19日在@程序员的那些事 微博推荐了此文的英文原文,非常感谢@dotSlash 的翻译.  转眼距我写<我如何在iOS教育类应用中赚到20万美元>这篇博文已经一年多了,它在独立社区中相当受欢迎,要知道它曾经在Hacker News上排过第一呢!我觉得是时候继续跟进一下我2012年的经验了.先交代一下我的背景,我是法国一个全职独立开发者,当iPad一开始发售的时候我就开始做教育类App了.我之所以决定做教育类App是因为我和我内人几年前决定让我们的孩子在家里接受教育,我意识到i