캐시(cache, 문화어: 캐쉬, 고속완충기, 고속완충기억기)는 컴퓨터 과학에서 데이터나 값을 미리 복사해 놓는 임시 장소를 가리킨다. 캐시는 캐시의 접근 시간에 비해 원래 데이터를 접근하는 시간이 오래 걸리는 경우나 값을 다시 계산하는 시간을 절약하고 싶은 경우에 사용한다. 캐시에 데이터를 미리 복사해 놓으면 계산이나 접근 시간 없이 더 빠른 속도로 데이터에 접근할 수 있다.
캐시는 시스템의 효율성을 위해 여러 분야에서 두루 쓰이고 있다.출처: 위키백과 - 캐시
위 설명처럼 캐시는 데이터에 접근하는 시간을 줄이려고 사용한다.
크게 메모리 캐시(memory cache)와 디스크 캐시(disk cache)로 나뉜다
😎 iOS 개발자로써 가장 많이 접하게 되는 cache는 단언컨데 image cache일 것임 -> 메모리/디스크 캐시를 통한 이미지 캐싱 과정까지 알아보자
이미지 캐싱은 데이터 처리속도를 최대한 높이고, 데이터가 차지하는 저장공간을 최소화하는 방향으로 설계되어야 함.
따라서 아래와 같은 순서로 이미지 캐싱이 진행됨.
실제로 Kingfisher 이러한 순서로 만들어진 라이브러리!!!
key-value쌍을 임시로 저장하는데 사용되는 변경 가능한 Collection
// NSCache 객체 생성
let imageCache = NSCache<NSString, UIImage>()
// NSCache를 이용해서 이미지를 메모리 캐시에 저장
imageCache.setObject(object, forKey: key as NSString)
// NSCache를 이용해서 메모리 캐시에서 이미지 획득
imageCache.object(forKey: key as NSString)
💡 key는 image의 urlString값을 사용
이럴때 쓰라고 있는게 싱글턴!!! 싱글턴으로 된 ImageCacheManager 객체를 만들어주자!!!
final class ImageCacheManager {
static let shared = NSCache<NSString, UIImage>()
private init() {}
}
let someImageView = UIImageView()
someImageView.image = UIImage()
extension UIImageView {
func loadImage() {
self.image = UIImage()
}
}
someImageView.loadImage()
1️⃣ 이미지를 네트워크에서 다운로드하기 전에 캐시된 이미지가 있는지 검색
2️⃣ 캐시된 이미지가 있다면 -> 캐시된 이미지를 가져와서 image에 적용
3️⃣ 캐시된 이미지가 없다면 -> 네트워크 통신을 하여 이미지를 다운로드
4️⃣ 새롭게 다운로드된 이미지 캐싱
extension UIImageView {
func loadImage(_ imageUrlString: String) {
let cacheKey = NSString(string: imageUrlString)
// 1️⃣
if let cachedImage = ImageCacheManager.shared.object(forKey: cacheKey) {
// 2️⃣
self.image = cachedImage
return
// 3️⃣
NetworkManager.shared.loadImage(imageID: imageUrlString) { result in
switch result {
case .success(let data):
if let data = data, let image = UIImage(data: data) {
DispatchQueue.main.async { [weak self] in
// 4️⃣
ImageCacheManager.shared.setObject(image, forKey: cacheKey)
self?.image = image
}
}
case .failure:
self.image = UIImage()
return
}
}
}
}
참고
https://jryoun1.github.io/swift/Cache/
https://ios-development.tistory.com/658