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

來源:互聯網
上載者:User

標籤:

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.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)

       以上代碼:

      1. 假如緩衝成功,會在緩衝(記憶體或者快閃記憶體中)得到一張適當大小的圖片(和UIImageView的 bounds以及contenMode有關),這一切都是後台進行的,所以不會卡,嗯。
      2. 假如沒有被緩衝過,從目標位置擷取圖片以後會進行壓縮產生一張合適大小的圖片,也是在後台進行,加入在NSURLCache中能找到,那麼從NSURLCache中擷取。
      3. 設定圖片,同時附帶動畫效果。
      4. 假如UIImageViewv正在以上操作中被重用,那不會進行操作。
      5. 快取作業之後的image
      6. 假如有必要,會清理緩衝中最少使用的圖片。 

 

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緩衝類)

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.