Skip to content

Commit 28f951f

Browse files
committed
fix: 캐시 로직 코드 간결과 및 이미지 캐싱하는 dataTask 전달하도록 변경
1 parent cf38be0 commit 28f951f

File tree

1 file changed

+46
-20
lines changed

1 file changed

+46
-20
lines changed

Queenfisher/Sources/ImageCache/ImageCacheImplements.swift

Lines changed: 46 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,9 @@ public final class DefaultImageCache: ImageCacheProtocol {
1313
// MARK: - Properties
1414
private let memoryCache = MemoryCacheStorage()
1515
private let diskCache = DiskCacheStorage()
16+
private let imageDownloader = ImageDownloader()
1617

18+
private var lastImage: CacheableImage?
1719
// 여기서 imageData 하나의 크기까지 지정해주려고 했는데 data 자체의 크기는 크지 않고, image로 바꾸는 연산이 들어가야하므로 빼기로 결정했습니다.
1820
// private let imageCostLimit: Int
1921

@@ -23,20 +25,39 @@ public final class DefaultImageCache: ImageCacheProtocol {
2325
}
2426

2527
// MARK: - Methods
26-
public func fetch(at url: URL, completion: @escaping (CacheableImage?) -> Void) {
27-
memoryCache.fetch(at: url) { [weak self] cacheableImage in
28-
if let cacheableImage {
29-
completion(cacheableImage)
30-
return
31-
}
32-
33-
// disk cache fetch
34-
self?.diskCache.fetch(at: url) { [weak self] diskImage in
35-
self?.executeDiskCacheLogic(diskImage: diskImage, url: url) { image in
36-
completion(image)
37-
}
38-
}
28+
public func fetchCached(at url: URL) -> CacheableImage? {
29+
return lastImage
30+
}
31+
32+
public func fetch(at url: URL, completion: @escaping (CacheableImage?) -> Void) -> URLSessionDataTask? {
33+
34+
if let memoryCached = memoryCache.fetch(at: url) {
35+
completion(memoryCached)
36+
return nil
37+
}
38+
39+
let diskCached = diskCache.fetch(at: url)
40+
var returnImage: CacheableImage?
41+
let task = self.executeDiskCacheLogic(diskImage: diskCached, url: url) { [weak self] image in
42+
returnImage = image
43+
self?.lastImage = image
3944
}
45+
completion(returnImage)
46+
return task
47+
// memoryCache.fetch(at: url) { [weak self] cacheableImage in
48+
// if let cacheableImage {
49+
// completion(cacheableImage)
50+
// return
51+
// }
52+
//
53+
// // disk cache fetch
54+
// self?.diskCache.fetch(at: url) { [weak self] diskImage in
55+
// task = self?.executeDiskCacheLogic(diskImage: diskImage, url: url) { image in
56+
// completion(image)
57+
// }
58+
// }
59+
// }
60+
// return task
4061
}
4162

4263
func config(_ configType: ConfigType) {
@@ -51,26 +72,29 @@ public final class DefaultImageCache: ImageCacheProtocol {
5172
// MARK: 이미지 캐시 로직
5273
extension DefaultImageCache {
5374

54-
private func executeDiskCacheLogic(diskImage: CacheableImage?, url: URL, completion: @escaping (CacheableImage?) -> Void) {
75+
private func executeDiskCacheLogic(diskImage: CacheableImage?, url: URL, completion: @escaping (CacheableImage?) -> Void) -> URLSessionDataTask {
5576
// 캐시에 값 O
77+
let dataTask: URLSessionDataTask
5678
if let diskImage {
57-
diskCacheHitted(diskImage: diskImage, url: url) { cacheableImage in
79+
dataTask = diskCacheHitted(diskImage: diskImage, url: url) { cacheableImage in
5880
completion(cacheableImage)
5981
return
6082
}
83+
6184
}
6285
// 캐시에 값 X
6386
else {
64-
diskCacheNotHitted(url: url) { cacheableImage in
87+
dataTask = diskCacheNotHitted(url: url) { cacheableImage in
6588
completion(cacheableImage)
6689
return
6790
}
6891
}
6992
completion(nil)
93+
return dataTask
7094
}
7195

72-
private func diskCacheHitted(diskImage: CacheableImage, url: URL, completion: @escaping (CacheableImage?) -> Void) {
73-
self.fetchImage(at: url, etag: diskImage.etag) { [weak self] result in
96+
private func diskCacheHitted(diskImage: CacheableImage, url: URL, completion: @escaping (CacheableImage?) -> Void) -> URLSessionDataTask {
97+
let dataTask = self.imageDownloader.fetchImage(at: url, etag: diskImage.etag) { [weak self] result in
7498
switch result {
7599
case .success(let networkImage): // 데이터 변경되어서 새로운 데이터 받아왔을 경우
76100
self?.diskCache.save(of: networkImage, at: url)
@@ -88,10 +112,11 @@ extension DefaultImageCache {
88112
}
89113
}
90114
}
115+
return dataTask
91116
}
92117

93-
private func diskCacheNotHitted(url: URL, completion: @escaping (CacheableImage?) -> Void) {
94-
self.fetchImage(at: url, etag: nil) { [weak self] result in
118+
private func diskCacheNotHitted(url: URL, completion: @escaping (CacheableImage?) -> Void) -> URLSessionDataTask {
119+
let dataTask = self.imageDownloader.fetchImage(at: url, etag: nil) { [weak self] result in
95120
switch result {
96121
case .success(let cacheableImage):
97122
self?.memoryCache.save(at: url, of: cacheableImage)
@@ -103,5 +128,6 @@ extension DefaultImageCache {
103128
return
104129
}
105130
}
131+
return dataTask
106132
}
107133
}

0 commit comments

Comments
 (0)