006 [翻譯] Haneke(一個Swfit iOS緩存類)

Github項目地址:https://github.com/Haneke/HanekeSwiftgit

     

      Haneke是一個用swift寫成的輕量級iOS類,以簡單好用著稱(design-decisions-behind-haneke-1-0),有多簡單呢?github

      假如你要初始化一個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"])
}

      就是這麼簡單。swift

      Haneke 還提供了內存緩存以及LRU(最少使用算法)閃存緩存,支持的格式有 UIImage, NSData, JSON, String  等等……換句話說,只要是可以讀寫爲 data格式的,就能緩存。api

      另外,Haneke 很是善於處理圖片任務:不須要額外操做就能夠自動處理圖片大小,這一切都在後臺完成,可讓主界面UI更流暢。載入,縮放圖片,緩存和顯示適配圖片僅僅只須要一行代碼:xcode

 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的獲取方法至關的簡便,網絡獲取舉例:

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如今還並不很是穩定.

相關文章
相關標籤/搜索