@@ -13,7 +13,9 @@ public final class DefaultImageCache: ImageCacheProtocol {
13
13
// MARK: - Properties
14
14
private let memoryCache = MemoryCacheStorage ( )
15
15
private let diskCache = DiskCacheStorage ( )
16
+ private let imageDownloader = ImageDownloader ( )
16
17
18
+ private var lastImage : CacheableImage ?
17
19
// 여기서 imageData 하나의 크기까지 지정해주려고 했는데 data 자체의 크기는 크지 않고, image로 바꾸는 연산이 들어가야하므로 빼기로 결정했습니다.
18
20
// private let imageCostLimit: Int
19
21
@@ -23,20 +25,39 @@ public final class DefaultImageCache: ImageCacheProtocol {
23
25
}
24
26
25
27
// 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
39
44
}
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
40
61
}
41
62
42
63
func config( _ configType: ConfigType ) {
@@ -51,26 +72,29 @@ public final class DefaultImageCache: ImageCacheProtocol {
51
72
// MARK: 이미지 캐시 로직
52
73
extension DefaultImageCache {
53
74
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 {
55
76
// 캐시에 값 O
77
+ let dataTask : URLSessionDataTask
56
78
if let diskImage {
57
- diskCacheHitted ( diskImage: diskImage, url: url) { cacheableImage in
79
+ dataTask = diskCacheHitted ( diskImage: diskImage, url: url) { cacheableImage in
58
80
completion ( cacheableImage)
59
81
return
60
82
}
83
+
61
84
}
62
85
// 캐시에 값 X
63
86
else {
64
- diskCacheNotHitted ( url: url) { cacheableImage in
87
+ dataTask = diskCacheNotHitted ( url: url) { cacheableImage in
65
88
completion ( cacheableImage)
66
89
return
67
90
}
68
91
}
69
92
completion ( nil )
93
+ return dataTask
70
94
}
71
95
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
74
98
switch result {
75
99
case . success( let networkImage) : // 데이터 변경되어서 새로운 데이터 받아왔을 경우
76
100
self ? . diskCache. save ( of: networkImage, at: url)
@@ -88,10 +112,11 @@ extension DefaultImageCache {
88
112
}
89
113
}
90
114
}
115
+ return dataTask
91
116
}
92
117
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
95
120
switch result {
96
121
case . success( let cacheableImage) :
97
122
self ? . memoryCache. save ( at: url, of: cacheableImage)
@@ -103,5 +128,6 @@ extension DefaultImageCache {
103
128
return
104
129
}
105
130
}
131
+ return dataTask
106
132
}
107
133
}
0 commit comments