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)
一些特性:緩存
尤爲對於images來講:安全
要求是iOS 8.0以及以上可能比較苛刻,由於蘋果剛剛公佈的數據是iOS8佔有率仍是隻有48%,不過若是是全新的項目,那徹底能夠關注一下Haneke。性能優化
集成到項目中:網絡
Haneke 打包成了 Swift 框架. 目前最簡單的引入方法
使用緩存:
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)
以上代碼:
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 提供了兩個特殊的fetchers:NetworkFetcher<T> and DiskFetcher<T>.你也能夠經過繼承fetchers<T> 來自定義fetchers 。經過自定義fetchers ,你能夠從網絡和閃存以外的另一些數據源中獲取數據(好比 Core Data)。你甚至能夠自定義 Haneke 訪問網絡或者閃存的方式,好比,用 Alamofire (相似於obj-c中的AFNetworking)來替代NSURLSession。一個自定義的 fetcer 必須繼承自Fetcher<T> ,知足如下條件:
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如今還並不很是穩定.