• 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保存。更多自定义的操作可以参考 formats, supporting 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 提供了两个特殊的fetchersNetworkFetcher<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

  • 相关阅读:
    项目太多工作环境互相干扰?virtualenv 一招教你轻松解决。
    安装的 Python 版本太多互相干扰?pyenv 建议了解一下。
    Python 拓展之详解深拷贝和浅拷贝
    Python 操作 SQLite 数据库
    IQueryable接口与IEnumberable接口的区别
    Resharper的配置(习惯使用了VS的F6编译和F12(快速非resharper查询编译代码)转到定义的默认设置)【设置了好多次resharper的使用了,特此记下简单的思路】
    程序人生,人生程序。(面向对象的奇葩理解)
    SQL表连接查询(inner join、full join、left join、right join)
    MYSQL中存储过程的创建,调用及语法
    mysql存储过程详解
  • 原文地址:https://www.cnblogs.com/cmblogs/p/4551227.html
Copyright © 2020-2023  润新知