21
19

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

イメージキャッシュライブラリのHanekeを使ってみた

Posted at

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だとクラッシュしたり、色々と疑問に思う点があった
  • ダウンロード処理が面倒だった

こうして書くと文句ばっかりに見えますね。
しかし、キャッシュ時にリサイズ出来る点やディスクキャッシュの上限を細かく決められる点などを考えると、細かいことを色々とやりたい場合は選択肢としてありだと感じました。
まだ理解していない点が一杯あるので継続して学習したいと思います!

21
19
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
21
19

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?