@@ -27,6 +27,7 @@ public final class ImageManager : ObservableObject {
2727 var manager : SDWebImageManager
2828 weak var currentOperation : SDWebImageOperation ? = nil
2929 var isFirstLoad : Bool = true // false after first call `load()`
30+ var isFirstPrefetch : Bool = true // false after first call `prefetch()`
3031
3132 var url : URL ?
3233 var options : SDWebImageOptions
@@ -106,6 +107,45 @@ public final class ImageManager : ObservableObject {
106107 }
107108 }
108109
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+
109149}
110150
111151// Completion Handler
0 commit comments