swiftでHanekeを使ってみた
iOSのimageキャッシュライブラリといえばSDWebImageが有名ですが、
その他にも以下のように色々あります。
- Haneke
- HanekeSwift
- Kingfisher
今回はHanekeをちょこっと使ってみたいと思います。
https://github.com/Haneke/Haneke
UIKitのオブジェクトにimageをセットする
HanekeにもSDWebImageと同じようにUIKit系のカテゴリが定義されていて、
イメージのセットはインスタンスメソッドから直感的に実行できます。
例えばUIButtonの場合はこんな感じ・・
let url = NSURL(string: "イメージのURL")
button.hnk_setImageFromURL(url, forState: .Normal, placeholder: nil)
SDWebImageを使った事がある人であれば、同じようなインターフェースなので迷うことはないと思います。
Hanekeではフォーマットを指定することにより、リサイズなど色々設定してキャッシュすることが出来ます。
var format = HNKCache.sharedCache().formats["thumbnail"] as? HNKCacheFormat
if format == nil
{
format = HNKCacheFormat(name: "thumbnail")
format!.size = CGSizeMake(320, 240)
format!.scaleMode = .AspectFill
format!.compressionQuality = 0.5
format!.diskCapacity = 1 * 1024 * 1024; // 1MB
format!.preloadPolicy = .None
}
imageView.hnk_cacheFormat = format
let url = NSURL(string: "イメージのURL")
imageView.hnk_setImageFromURL(url, placeholder: nil)
注意すべきなのは、オブジェクトが持つプロパティをHaneke側でcacheFormatに沿って上書きするところです。
例えば、imageViewのcontentModeにScaleAspectFitを設定していても、chacheFormatのscaleModeに設定されているHNKScaleModeAspectFillで表示されます。
imageをダウンロード
単純に画像をUIImageとしてダウンロードしたい場合は下のようになります。
let url = NSURL(string: "イメージのURL")
let cache = HNKCache.sharedCache()
var format = cache.formats["thumbnail"] as? HNKCacheFormat
if format == nil {
format = HNKCacheFormat(name: "thumbnail")
format!.scaleMode = .None
}
cache.registerFormat(format)
cache.fetchImageForFetcher(HNKNetworkFetcher(URL: url), formatName: "thumbnail", success: {
(image: UIImage!) in
// ダウンロード後の処理
}, failure: nil)
こちらはSDWebImageに比べて直感的ではないですね・・
もっといい方法があれば教えて下さい。
ポイントはfetchImageForFetcherに渡すクラスです。
HNKFetcherプロトコルを実装したクラスがいくつかあり、取得先によって使いわけるようです。
今回はHNKNetworkFetcherのインスタンスを渡していますが、ディスクから取得したい場合はHNKDiskFetcherを渡します。
注意点は、registerFormatによってformatを登録しておかないと実行時にクラッシュしてしまう事です。
感想
- キャッシュ時の設定を色々出来るのは凄いと思った
- SDWebImageに比べて簡単に使える印象はなかった
- hnk_setImageFromURLする時にオブジェクトのサイズが0だとクラッシュしたり、色々と疑問に思う点があった
- ダウンロード処理が面倒だった
こうして書くと文句ばっかりに見えますね。
しかし、キャッシュ時にリサイズ出来る点やディスクキャッシュの上限を細かく決められる点などを考えると、細かいことを色々とやりたい場合は選択肢としてありだと感じました。
まだ理解していない点が一杯あるので継続して学習したいと思います!