Mac Plus

Hello Swift

NSCache

  • iOS앱을 개발하면서 이미지를 처리하는데 있어 SDWebimage, Alamofireimage등 여러 이미지 라이브러리만 가져다 사용하면 자동으로 이미지를 캐시처리를 해줘서 NSCache에 대해서 잘 모르고 있는거 같아서 정리함

NSCache

  • 캐시란? 간단하게 얘기하면 값을 미리 복사해 놓은 임시 장소를 말한다. 저장공간이 작고 빠른성능을 제공하는데 보통 서버에서 내려오는 default데이터나 동일한 이미지를 캐시에 저장하여 더 빠른 로딩을 할 수 있다. Swift에서도 캐시를 지원하는데 그것이 바로 NSCache인것이다.

장정 및 단점

  • 앱실행 속도가 빨라진다, 트래픽이 감소된다(같은 이미지를 반복적으로 다운로드 받아도 되지 않기 때문에)
  • 서버에서 이미지가 변경되어도 앱에는 반영이 바로 되지 않는 경우가 발생된다.

단점 극복

  • 이 방법이 best인지는 모르겠지만 변경된 이미지를 서버에 올릴때 현재 날짜와 시간을 같이 올려주면 앱내에서 저장된 값과 비교하여 다른 이미지라고 판단될때 다운로드한다.
  • 검색결과: 서버 이미지 경로에 md5sum인자값을 줘야 한다고함(?)

NSCache - 공식문서: 리소스가 부족할때 키-값을 가지고 임시로 저장하는데 사용하는 컬렉션이라고 말하고 있다.

특징

  1. 캐시가 메모리를 너무 많이 사용하지 않도록 자동제거 기능이 존재한다 (최근에 적게 사용한 객체 먼저) (NSDictionary에서는 삭제를 구현해줘야함)
  2. 캐시안에 들어있는 데이터들을 복사하지 않고 참조한다

사용방법

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을 가지고 다운로드 받은뒤 캐시를 이용하여 처리해보자.