@@ -100,6 +100,75 @@ await SimpleImageProvider.shared.requestImage(...)
100
100
101
101
※ 샘플링이 완료된 이미지가 캐싱됩니다.
102
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
+
103
172
### 플로우 차트
104
173
105
174
``` mermaid
0 commit comments