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

研究
この記事は約3分で読めます。

この記事は3年前の記事です。当時の情報、理解に基づいておりますのでご留意ください

そもそも、PINCacheって?

pinterest/PINRemoteImage
A thread safe, performant, feature rich image fetcher - pinterest/PINRemoteImage

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

pinterest/PINCache
Fast, non-deadlocking parallel object cache for iOS, tvOS and OS X - pinterest/PINCache

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

Swiftの有名画像キャッシュライブラリを比較してみた - Qiita
前置き サーバーから受け取った画像のパスを、String型 → URL型に変換して TableViewなりCollectionViewに表示するっていうことは結構多々あると思います。 今まで自作アプリを作る時になんとなく実装し...

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ができるといいなぁ、とか…

コメント

タイトルとURLをコピーしました