두 라이브러리 모두 비동기환경에서 이미지를 받아오고 처리하는 라이브러리다. 여러 귀찮은 작업들(기본 이미지, 캐시, call 취소) 등이 구현되어 있어 편리하다는 장점이 존재한다.
무슨 차이일까?
1. 구현 언어
Kingfisher는 Swift로 짜여 있고 SDWebImage는 Objective-C로 짜여 있다는 차이점이 존재한다. (캐시를 처리해야 하므로 킹피셔에 Objective-C가 있긴 하다)


2. 동시성 처리
동시성 프로그래밍을 위해 Kingfisher는 GCD를 사용하지만 SDWebImage는 NSOperation을 사용한다. 나중에는 Swift Concurrency로 짜인 라이브러리가 나올지도?
3. 캐시
캐시를 처리할 때 Kingfisher는 기본적으로 메모리 캐시가 적용되어 있다. 원하는 경우 디스크 캐시를 사용하도록 설정하면 된다. 반면, SDWebImage의 경우 기본적으로 메모리와 디스크 캐시를 모두 사용하는 방식을 취하고 있다. 먼저 메모리에서 찾고 없으면 디스크에서 찾는 방식을 사용하기에 편리하지만, 앱의 사이즈가 일정기간 생각보다 커질 수 있다는 단점이 있다.
사실 이걸 적으려고 이 글을 쓰게 됐는데 캐시 관련해서 설정하는 코드는 다음과 같다.
import Kingfisher
// 원하는 캐시 인스턴스를 만들어서 사용하던지 싱글톤으로 처리해도 된다.
let cache = ImageCache(name: "원하는이름")
// 아래 코드는 싱글톤
// 메모리 캐시 설정
let memoryCacheSize = 50 * 1024 * 1024 // 50MB
let memoryCacheSize = 0 // 메모리 캐시 비활성화
ImageCache.default.memoryStorage.config.totalCostLimit = memoryCacheSize
// 디스크 캐시 설정
let diskCacheSize = 100 * 1024 * 1024 // 100MB
let diskCacheSize = 0 // 디스크 캐시 비활성화
ImageCache.default.diskStorage.config.sizeLimit = diskCacheSize
// 캐시 만료 시간 설정
let cacheExpiration: TimeInterval = 60 * 60 * 24 * 7 // 1주
ImageCache.default.diskStorage.config.expiration = .seconds(cacheExpiration)
import SDWebImage
// 원하는 캐시 인스턴스를 만들어서 사용하던지 싱글톤으로 처리해도 된다.
let cache = SDImageCache(namespace: "원하는이름")
// 아래 코드는 싱글톤
// 메모리 캐시 설정
let memoryCacheSize = 50 * 1024 * 1024 // 50MB
SDImageCache.shared.config.maxMemoryCost = memoryCacheSize
// 메모리 캐시 비활성화
SDImageCache.shared.config.maxMemorycost = 0
// 디스크 캐시 설정
let diskCacheSize = 100 * 1024 * 1024 // 100MB
SDImageCache.shared.config.maxDiskSize = diskCacheSize
// 디스크 캐시 비활성화
SDImageCache.shared.config.diskCacheReadingOptions = .uncached
// 캐시 만료 시간 설정
let cacheExpiration: TimeInterval = 60 * 60 * 24 * 7 // 1주
SDImageCache.shared.config.diskCacheExpireType = .custom
SDImageCache.shared.config.diskCacheCustomExpireDate = Date().addingTimeInterval(cacheExpiration)
'Swift > etc' 카테고리의 다른 글
| [UIKit] iOS의 UIKit을 이용한 Google Sign-In (0) | 2023.03.23 |
|---|---|
| [Firebase] Database lives in a different region 에러 (0) | 2023.03.21 |
| [RxSwift] debounce 그리고 throttle (덤으로 distinctUntilChanged) (0) | 2023.03.19 |
| [Swift] 함수의 매개변수(Parameter) 레이블 (0) | 2023.03.18 |
| [Xcode] 디버거에서 data 타입을 사람이 볼 수 있는 방식으로 변환하는 법 (0) | 2023.03.18 |