|
7 | 7 | | **지원 iOS 버전** | iOS 15.0 이상 |
|
8 | 8 | | **사용한 기술** | Swift, Swift Concurrency |
|
9 | 9 |
|
10 |
| -</table> |
| 10 | + |
| 11 | +## SimpeImageProvider 라이브러리를 사용중인 서비스 |
| 12 | + |
| 13 | +| 항목 | 링크 | |
| 14 | +|-----------------|----------------------------| |
| 15 | +| **케어밋** | [앱스토어](https://apps.apple.com/kr/app/%EC%BC%80%EC%96%B4%EB%B0%8B/id6670529341) | |
11 | 16 |
|
12 | 17 | ## how to use
|
13 | 18 |
|
@@ -95,6 +100,75 @@ await SimpleImageProvider.shared.requestImage(...)
|
95 | 100 |
|
96 | 101 | ※ 샘플링이 완료된 이미지가 캐싱됩니다.
|
97 | 102 |
|
| 103 | +### 사이즈 기반 이미지 캐싱 |
| 104 | + |
| 105 | +디스크 및 메모리에 캐싱되는 이미지는 **다운 샘플링이 적용된 이미지가 캐싱**됩니다. |
| 106 | + |
| 107 | +동일한 이미지이지만 샘플링 결과에따라 다르게 캐싱을 진행합니다. |
| 108 | + |
| 109 | +아래 캐싱키 값에 다운샘플링 사이즈가 포함되는 것을 확인할 수 있습니다. |
| 110 | + |
| 111 | +```swift |
| 112 | + |
| 113 | +func createKey(url: String, size: CGSize?) -> String { |
| 114 | + |
| 115 | + var keyString = url |
| 116 | + |
| 117 | + if let size { |
| 118 | + |
| 119 | + let width = size.width |
| 120 | + let height = size.height |
| 121 | + |
| 122 | + keyString += "\(width)x\(height)" |
| 123 | + } |
| 124 | + |
| 125 | + return keyString |
| 126 | +} |
| 127 | + |
| 128 | +``` |
| 129 | + |
| 130 | +### 다운 샘플링 |
| 131 | + |
| 132 | +이미지 다운 샘플링은 다운로드 받은 데이터 버퍼를 `CGImageSource`로 변경합니다. |
| 133 | + |
| 134 | +`CGImageSource`를 특정 사이즈의 썸네일(원본보다 작은/축약된 이미지)로 변경하는 작업을 통해 다운 샘플링을 진행합니다. |
| 135 | + |
| 136 | +※ 이미지 캐싱을 직접관리하기 위해 이미지소스생성시와 썸네일 생성시 추가적인 캐싱옵션을 모두 해제했습니다. |
| 137 | + |
| 138 | +```swift |
| 139 | + |
| 140 | +func downSamplingImage(dataBuffer: Data, size: CGSize) async -> UIImage? { |
| 141 | + |
| 142 | + let imageSourceOptions = [kCGImageSourceShouldCache: false] as CFDictionary |
| 143 | + |
| 144 | + guard let imageSource = CGImageSourceCreateWithData(dataBuffer as CFData, |
| 145 | +imageSourceOptions) else { |
| 146 | + |
| 147 | + return nil |
| 148 | + } |
| 149 | + |
| 150 | + let biggerLength = max(size.width, size.height) |
| 151 | + let scale = await UIScreen.main.scale |
| 152 | + let maxDimensionInPixels = biggerLength * scale |
| 153 | + let downsampleOptions = [ |
| 154 | + kCGImageSourceCreateThumbnailFromImageAlways: true, |
| 155 | + kCGImageSourceShouldCacheImmediately: false, |
| 156 | + kCGImageSourceCreateThumbnailWithTransform: true, |
| 157 | + kCGImageSourceThumbnailMaxPixelSize: maxDimensionInPixels |
| 158 | + ] as CFDictionary |
| 159 | + |
| 160 | + guard let downsampledImage = CGImageSourceCreateThumbnailAtIndex(imageSource, 0, |
| 161 | +downsampleOptions) else { |
| 162 | + return nil |
| 163 | + } |
| 164 | + let image = UIImage(cgImage: downsampledImage) |
| 165 | + |
| 166 | + return image |
| 167 | +} |
| 168 | + |
| 169 | +``` |
| 170 | + |
| 171 | + |
98 | 172 | ### 플로우 차트
|
99 | 173 |
|
100 | 174 | ```mermaid
|
|
0 commit comments