【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
}()
}
Reference
이 문제에 관하여(【swift4】 image를 cache화한다), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/yasui83/items/73c31ddb72337e674fe3텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)