Skip to content

Instantly share code, notes, and snippets.

@linearhw
Last active June 17, 2022 09:55
Show Gist options
  • Save linearhw/0b15231c3de5de4b03fcdfe1161a08ec to your computer and use it in GitHub Desktop.
Save linearhw/0b15231c3de5de4b03fcdfe1161a08ec to your computer and use it in GitHub Desktop.
SDWebImage 의 기능 요약/정리

SDWebImage

데이터 변환

  • Remote > Data & Image
    • URLSession delegate 의 receiveData 로부터 받은 data 를 모은 다음, SDWebImageIOCoder 의 incrementallyDecodedImageWithData 를 호출하여 이미지 생성
  • Data > toDisk
    • CGImageRef 로부터 alpha 값이 있는지를 구분해서, alpha 값이 있으면 PNG 아니면 JPEG 으로 encode
    • CGImageDestinationAddImage method 사용

캐시 저장

기본적인 순서는 아래 이미지 참고

옵션

  • shouldCacheImagesInMemory: 메모리 캐시의 사용 여부. default YES

  • SDImageCacheConfig 를 통해 maxCacheSize 와 maxCacheAge 를 설정할 수 있다.

    • maxCacheSize : 디스크의 사이즈. 기본값 0. 0이면 expire 된 것만 지우고, 캐시 용량이 다 차서 지우는 로직을 사용하지 않음.
    • expire 는 maxCacheAge 값으로 판단. 기본값 1주일.
  • maxMemoryCost. 메모리 캐시(= NSCache)의 totalCostLimit 값. 기본값은 0.

  • 다만 NSCache는 용량이 다 차서 object 를 evict 하는 경우 순서는 보장되어 있지 않다. (by 애플 공식 문서)

  • SDImageCacheQueryDataWhenInMemory

  • SDWebImageFromCacheOnly

  • SDWebImageRefreshCached (이 옵션이 설정된 경우 NSURLCache 가 사용된다)

  • SDWebImageProgressiveDownload (이 옵션이 설정된 경우 SDWebImageScaleDownLargeImages는 사용할 수 없다)

메모리 관리

  • memory warning notification 을 받으면 memCache 에 있는 모든 이미지를 지운다.
  • 앱이 꺼지거나 백그라운드로 진입하면 deleteOldFiles 를 호출. expire 된 것들을 지운 다음, 여전히 디스크 용량을 많이 차지하고 있으면 NSURLContentModificationDateKey로 정렬하여 지운다. (LRU)
  • 참고로 디스크 캐시가 저장되는 곳은 기본 Cache Directory + “com.hackemist.SDWebImageCache” + namespace(기본값은 "default")

이미지 프로세싱

썸네일 처리

  • 따로 없음
  • config 에서 shouldDecompressionImages 를 NO로 설정하면 메모리 사용량을 줄일 수 있음. 기본값은 YES
  • 근데 NO로 설정해도 이미지 한 장의 max용량을 60MB로 설정해서 scale 을 계산하기 때문에 현재로선 의미가 없어 보인다.
  • 60MB라는 값을 직접 조정할 수 있도록 5.0.0 에서 변경될 예정.

그 외의 전처리

  • url 로부터 다운로드 받은 후, 캐싱하기 전에 image processing 을 하고 싶다면 SDWebImageManagerDelegate 의 transformDownloadImage 를 직접 구현해야 한다.

GIF 처리

  • SDWebImage/GIF 라는 subspec 을 Podfile 에 추가하면 GIF 에 대해서도 사용 가능.
  • 대신 UIImageView 로 되어 있는 부분을 FLAnimatedImageView 로 변경해야 한다.

기타

  • 캐시로부터 찾아오지 못했을 때 다운로드 받을지 말지도 shouldDownloadImageForURL method 구현으로 조정할 수 있다.
  • 이미지를 캐싱하기 위한 key 값으로 url 을 쓰지 않을 수는 있지만 좋은 방향은 아닌 것 같다. (URL 임을 가정하고 구현되어 있는 부분들이 많아서)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment