캐싱 하는 이유

로컬의 메모리 혹은 디스크에 캐싱 되어 있다면

불필요한 네트워크 호출을 줄일 수 있다.

속도도 빠름

일반 적인 캐시 흐름

메모리 Cache → disk Cache(있다면 메모리 Cache에 저장) → 서버 통신

NSCache

• key-value쌍을 임시로 저장하는데 사용되는 변경 가능한 Collection

자체 적으로 너무 많은 메모리를 차지않도록 자동으로 제거되는 정책을 가진다.

디폴트로 캐시 객체는 컨텐츠가 삭제 되면 자동으로 제거 (변경 가능)

이미지 캐싱 방법

class ImageCacheManager {
    static let shared = NSCache<NSString, UIImage>()
    private init() {}
}
extension UIImageView {
    func setImage(_ url: String) {
        DispatchQueue.global(qos: .background).async {
            guard let url = URL(string: url) else { return }

            /// API 통신
            URLSession.shared.dataTask(with: url) { (data, result, error) in

                /// API통신에서 에러가 난 경우
                guard error == nil else {
                    DispatchQueue.main.async { [weak self] in
                        self?.image = UIImage()
                    }
                    return
                }

                /// API가 정상 동작한 경우
                DispatchQueue.main.async { [weak self] in
                    if let data = data, let image = UIImage(data: data) {
                        self?.image = image
                    }
                }
            }.resume()
        }
    }
}

캐싱 적용