標籤:
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以及以上可能比較苛刻,因為蘋果剛剛公布的資料是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.sharedDataCachecache.set(value: data, key: "funny-games.mp4")// 然後...cache.fetch(key: "funny-games.mp4").onSuccess { data in // data相關的操作可以在這裡進行}
在多數情況下,我們總是要去網路或者快閃記憶體重新讀取值,但是Haneke提供了簡便的擷取方法,回到第一個例子,這次使用shared cache:
let cache = Haneke.sharedJSONCachelet 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.sharedImageCachelet 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的擷取方法相當的簡便,網路擷取舉例:
| 12345 |
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 Resultclass func convertFromData(data:NSData) -> Result?}public protocol DataRepresentable {func asData() -> NSData!}
假如想讓 NSDictionary 增加緩衝支援:
extension NSDictionary : DataConvertible, DataRepresentable {public typealias Result = NSDictionarypublic 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緩衝類)