로컬의 메모리 혹은 디스크에 캐싱 되어 있다면
불필요한 네트워크 호출을 줄일 수 있다.
속도도 빠름
메모리 Cache → disk Cache(있다면 메모리 Cache에 저장) → 서버 통신
• 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()
}
}
}
캐싱 적용