- iOS앱을 개발하면서 이미지를 처리하는데 있어 SDWebimage, Alamofireimage등 여러 이미지 라이브러리만 가져다 사용하면 자동으로 이미지를 캐시처리를 해줘서 NSCache에 대해서 잘 모르고 있는거 같아서 정리함
NSCache
- 캐시란? 간단하게 얘기하면 값을 미리 복사해 놓은 임시 장소를 말한다. 저장공간이 작고 빠른성능을 제공하는데 보통 서버에서 내려오는 default데이터나 동일한 이미지를 캐시에 저장하여 더 빠른 로딩을 할 수 있다. Swift에서도 캐시를 지원하는데 그것이 바로 NSCache인것이다.
장정 및 단점
- 앱실행 속도가 빨라진다, 트래픽이 감소된다(같은 이미지를 반복적으로 다운로드 받아도 되지 않기 때문에)
- 서버에서 이미지가 변경되어도 앱에는 반영이 바로 되지 않는 경우가 발생된다.
단점 극복
- 이 방법이 best인지는 모르겠지만 변경된 이미지를 서버에 올릴때 현재 날짜와 시간을 같이 올려주면 앱내에서 저장된 값과 비교하여 다른 이미지라고 판단될때 다운로드한다.
- 검색결과: 서버 이미지 경로에 md5sum인자값을 줘야 한다고함(?)
NSCache - 공식문서: 리소스가 부족할때 키-값을 가지고 임시로 저장하는데 사용하는 컬렉션이라고 말하고 있다.
특징
- 캐시가 메모리를 너무 많이 사용하지 않도록 자동제거 기능이 존재한다 (최근에 적게 사용한 객체 먼저) (NSDictionary에서는 삭제를 구현해줘야함)
- 캐시안에 들어있는 데이터들을 복사하지 않고 참조한다
사용방법
import Foundation
var imageCache = NSCache<AnyObject, AnyObject>()
//1. 이름을 get/set 해줄수 있다. (이름 넣어서 어떻게 사용할 수 있을까??)
imageCache.name = "이미지캐시이름"
print(imageCache.name) //이미지캐시이름
//2. 캐시 보유 최대개체 수 - 제한이 정확하지 않거나 엄격하지 않음
imageCache.countLimit = Int값
imageCache.totalCostLimit = Int값 //개체 제거를 시작하기전에 캐시가 보유할 수 있는 최대비용 (기본값 0)
//3. 삭제 가능한 개체를 자동으로 삭제할건지
imageCache.evictsObjectsWithDiscardedContent = true //기본값이 true임
//4. 주어진 키와 값을 반환하는 방법
imageCache.object(forKey: "")
if let cacheImage = imageCache.object(forKey: "ImageUrl값" as AnyObject) as? UIImage {
self.imageView = cacheImage
return
}
//5. 값을 키에 저장한다.
imageCache.setObject(image, forKey: urlString as AnyObject)
//6. 캐시에 저장된 키의 값을 제거
imageCache.removeObject(forKey: "key값")
//7. 전체삭제
imageCache.removeAllObjects()
- 기본적인 문법을 알아봤으니 다음에는 통신을 통해서 imageUrl을 가지고 다운로드 받은뒤 캐시를 이용하여 처리해보자.