【swift4】 image를 cache화한다

8881 단어 Cache이미지Swift4
Swift4에서 image를 cache화하는 정보가 좀처럼 발견되지 않았기 때문에, 기재해 가고 싶습니다.
만약 실수등이 있으면, 지적해 주시면 기쁩니다!

먼저 iOS에서는 NSCache 클래스를 사용하여 캐시를 수행합니다.

NSCache 정보



이미지등을 URL로부터 읽어들이는 것 같은 처리를 하고 있으면, 매회 읽어들이기에 시간이 걸립니다. 그래서 이미지를 캐시하고 iOS 메모리에 저장합니다. 이렇게 하면 다시 로드할 필요가 없으며 처리 속도가 빨라집니다.
단지 iOS의 메모리가 부족해지면, 자동적으로 이 캐시는 없어지게 되어 있습니다.

  • dictionary 형과 같고, key 와 value 의 세트입니다.
    저장할 데이터가 값이 되고 저장한 데이터를 검색하기 위해 키를 설정해야 합니다.

  • ex)
    static let imageCache = NSCache<AnyObject, AnyObject>()
    

    이번에는 image를 캐시하기 때문에 UIImageView의 extension으로 정의합니다.

    UIImageViewExtension



    UIImageViewExtension.swift
    import UIKit
    
    extension UIImageView {
    
        //NSCacheのインスタンスを生成しておく。ここに、どんどんキャッシュ化されたものが保存されていく。
        static let imageCache = NSCache<AnyObject, AnyObject>()
    
        //読み込むURLのstringを引数にする。
        func cacheImage(imageUrlString: String) {
    
            //引数のimageUrlStringをURLに型変換する。
            let url = URL(string: imageUrlString)
    
            //引数で渡されたimageUrlStringがすでにキャッシュとして保存されている場合は、キャッシュからそのimageを取り出し、self.imageに代入し、returnで抜ける。
            if let imageFromCache = UIImageView.imageCache.object(forKey: imageUrlString as AnyObject) as? UIImage {
                self.image = imageFromCache
                return
            }
    
            //上記のifに引っかからないということは、キャッシュとして保存されていないということなので、以下でキャッシュ化をしていく。
            //URLSessionクラスのdataTaskメソッドで、urlを元にして、バックグランドでサーバーと通信を行う。
            //{ 以降はcompletionHandler(クロージャー)で、通信処理が終わってから実行される。
            //dataはサーバーからの返り値。urlResponseは。HTTPヘッダーやHTTPステータスコードなどの情報。リクエストが失敗したときに、errorに値が入力される。失敗しない限り、nilとなる。
            URLSession.shared.dataTask(with: url!) { (data, urlResponse, error) in
    
                //errorがnilじゃないということは、リクエストに失敗しているということ。returnで抜け出す。
                if error != nil {
                    print(error)
                    return
                }
    
                //リクエストが成功して、サーバーからのresponseがある状態。
                //しかし、UIKitのオブジェクトは必ずメインスレッドで実行しなければならないので、DispatchQueue.mainでメインキューに処理を追加する。非同期で登録するので、asyncで実装。
                DispatchQueue.main.async {
    
                    //サーバーからのレスポンスのdataを元にして、UIImageを取得し、imageToCacheに代入。
                    let imageToCache = UIImage(data:data!)
    
                    //self.imageにimageToCacheを代入。
                    self.image = imageToCache
    
                    //keyをimageUrlStringとして、imageToCacheをキャッシュとして保存する。
                    UIImageView.imageCache.setObject(imageToCache!, forKey: imageUrlString as AnyObject)
                }
            }.resume()
        }
    }
    

    실제로 이 메서드를 호출하는 코드

    example.swift
    import UIKit
    
    class ExampleViewController: UIViewController {
    
        let imgString = "https://XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"
    
        override func viewDidLoad() {
            super.viewDidLoad()
    
            profileImage.cacheImage(imageUrlString: imgString)
    
        let profileImage: UIImageView = {
            let image = UIImageView()
            let myColor = UIColor(red: 246/255, green: 177/255, blue: 67/255, alpha: 1)
            image.contentMode = .scaleAspectFill
            image.layer.borderColor = myColor.cgColor
            image.backgroundColor = UIColor.white
            return image
        }()
    
    }
    
    
    

    좋은 웹페이지 즐겨찾기