Prism은 SwiftUI의 AsyncImage에 캐싱 기능을 추가한 이미지 로딩 라이브러리입니다.
메모리 캐싱과 AsyncStream 기반 상태 관리를 통해 효율적인 이미지 로딩 경험을 제공합니다.
SwiftUI의 AsyncImage는 매번 네트워크 요청을 통해 이미지를 다운로드 하기 때문에 아래와 같은 문제가 있습니다.
- 사용자가 스크롤할 때마다 같은 이미지를 반복 다운로드
- 네트워크 비용 증가 (데이터 요금, 서버 부하)
- 네트워크 대기 시간으로 인한 로딩 지연
- 배터리 소모 증가
따라서 이미지 캐싱을 이용해 해당 문제점을 해결합니다.
- Swift Concurrency의 AsyncStream을 활용한 실시간 로딩 상태 전달
.loading→.loaded/.failed상태 흐름- SwiftUI의 선언적 패러다임과 자연스러운 통합
- NSCache 기반 자동 메모리 관리
- 동일 이미지 재요청 시 네트워크 호출 없이 즉시 반환
AsyncImage 사용 |
PrismImage 사용 |
|---|---|
AsyncImageDemo.mp4 |
PrismImageDemo.mp4 |
- 화면 재진입 시 캐싱된 이미지를 사용해 로딩 속도를 개선합니다.
- iOS 17.0+
- Swift 6.0+
- NSData
- 장점: UIImage와 비교해 캐싱 시 메모리 사용 부담이 적음.
- 단점: 캐싱 후 렌더링을 위해 디코딩, 작업이 필요.
- JPEG/PNG 이미지의 경우 압축 해제 및 디코딩이 필요함.
- 디코딩은 CPU Intensive 작업이므로 Hang 발생 우려.
- UIImage
- 장점: 디코딩 된 이미지를 바로 저장하므로 성능 최적화 가능.
- 단점: NSData와 비교해 캐싱 시 메모리 사용량 증가.
캐싱의 주요 목적은 성능 향상과 사용자 경험 개선입니다. 메모리 캐시의 경우 스크롤 시 빠른 이미지 로딩이 사용자 경험에 직접적인 영향을 미치므로 반응성 확보가 우선이라고 판단했습니다.
따라서 메모리 캐싱 시에는 디코딩이 완료된 UIImage를 저장하도록 구현했습니다.