@@ -27,6 +27,7 @@ public final class ImageManager : ObservableObject {
27
27
var manager : SDWebImageManager
28
28
weak var currentOperation : SDWebImageOperation ? = nil
29
29
var isFirstLoad : Bool = true // false after first call `load()`
30
+ var isFirstPrefetch : Bool = true // false after first call `prefetch()`
30
31
31
32
var url : URL ?
32
33
var options : SDWebImageOptions
@@ -106,6 +107,45 @@ public final class ImageManager : ObservableObject {
106
107
}
107
108
}
108
109
110
+ /// Prefetch the initial state of image, currently query the memory cache only
111
+ func prefetch( ) {
112
+ isFirstPrefetch = false
113
+ // Use the options processor if provided
114
+ let options = self . options
115
+ var context = self . context
116
+ if let result = manager. optionsProcessor? . processedResult ( for: url, options: options, context: context) {
117
+ context = result. context
118
+ }
119
+ // TODO: Remove transformer for cache calculation before SDWebImage 5.7.0, this is bug. Remove later
120
+ let transformer = ( context ? [ . imageTransformer] as? SDImageTransformer ) ?? manager. transformer
121
+ context ? [ . imageTransformer] = nil
122
+ // TODO: before SDWebImage 5.7.0, this is the SPI. Remove later
123
+ var key = manager. perform ( Selector ( ( " cacheKeyForURL:context: " ) ) , with: url, with: context) ? . takeUnretainedValue ( ) as? String
124
+ if let transformer = transformer {
125
+ key = SDTransformedKeyForKey ( key, transformer. transformerKey)
126
+ }
127
+ // Shortcut for built-in cache
128
+ if let imageCache = manager. imageCache as? SDImageCache {
129
+ let image = imageCache. imageFromMemoryCache ( forKey: key)
130
+ self . image = image
131
+ if let image = image {
132
+ self . successBlock ? ( image, . memory)
133
+ }
134
+ } else {
135
+ // This callback is synchronzied
136
+ manager. imageCache. containsImage ( forKey: key, cacheType: . memory) { [ unowned self] ( cacheType) in
137
+ if cacheType == . memory {
138
+ self . manager. imageCache. queryImage ( forKey: key, options: options, context: context) { [ unowned self] ( image, data, cacheType) in
139
+ self . image = image
140
+ if let image = image {
141
+ self . successBlock ? ( image, cacheType)
142
+ }
143
+ }
144
+ }
145
+ }
146
+ }
147
+ }
148
+
109
149
}
110
150
111
151
// Completion Handler
0 commit comments