【Swift4】画像のキャッシュにPINCacheを使ってみた

投稿者:

そもそも、PINCacheって?

https://github.com/pinterest/PINRemoteImage

親ライブラリはこちら、PINRemoteImage。
Pinterestで利用されている画像ローダー。

https://github.com/pinterest/PINCache

そのうち、キャッシュにまつわるライブラリはこちら。

https://qiita.com/hcrane/items/422811dfc18ae919f8a4

Alamofire他の画像ライブラリとの比較はこちら。
今回、上司命令でこれを使うことになったので使い方を備忘録がてら。

使ってみましょう

podをインストールしたら、まず

import PINRemoteImage
import PINCache

順序としては逆と思うかもしれませんが、先に表示箇所へ反映してやりたいので
viewDidLoad()らへんで既存のキャッシュを見に行きます。

PINCache.shared().object(forKey: "(画像キー)") { (cache, key, object) in
	if var image = object as? UIImage {
		self.profile_image = image
	}
}

画像のキーは他のものと被らない一意に設定できるものを使います。
何かしらのテーブルから取ってきてるんではないかと思うので、
引用元のテーブル+連番でいいんじゃないでしょうか。

一方今回キャッシュが無かったら、新規にデータを取ってきて格納します。

if (self.profile_image != nil){
    testSection.profilePictureButton.setImage(self.profile_image, for: UIControl.State.normal)
}
else{
    let storage = Storage.storage().reference().child("データベースから取ってきた画像の参照先")
    storage.getData(maxSize: 1 * 1024 * 1024) {
        data, error in
        if let error = error {
        }
        else {
            let image = UIImage(data: data!)!
            profilePictureButton.setImage(image, for: UIControl.State.normal)
            PINCache.shared().setObject(image, forKey: "(画像キー)")
        }
    }
}

firebase strageから取ってくるのは前回同様。
これでキャッシュされている限り画像がサクサク表示されます。

あとは本当はPreloadができるといいなぁ、とか…

コメントを残す