diff --git a/SDWebImageSwiftUI/Classes/AnimatedImage.swift b/SDWebImageSwiftUI/Classes/AnimatedImage.swift index da63db90..3ed4aa34 100644 --- a/SDWebImageSwiftUI/Classes/AnimatedImage.swift +++ b/SDWebImageSwiftUI/Classes/AnimatedImage.swift @@ -172,6 +172,24 @@ public struct AnimatedImage : PlatformViewRepresentable { } #endif + func loadImage(_ view: AnimatedImageViewWrapper, url: URL) { + let operationKey = NSStringFromClass(type(of: view.wrapped)) + let currentOperation = view.wrapped.sd_imageLoadOperation(forKey: operationKey) + if currentOperation != nil { + return + } + view.wrapped.sd_setImage(with: url, placeholderImage: placeholder, options: webOptions, context: webContext, progress: { (receivedSize, expectedSize, _) in + self.imageModel.progressBlock?(receivedSize, expectedSize) + }) { (image, error, cacheType, _) in + if let image = image { + self.imageModel.image = image + self.imageModel.successBlock?(image, cacheType) + } else { + self.imageModel.failureBlock?(error ?? NSError()) + } + } + } + func makeView(context: PlatformViewRepresentableContext) -> AnimatedImageViewWrapper { AnimatedImageViewWrapper() } @@ -185,16 +203,7 @@ public struct AnimatedImage : PlatformViewRepresentable { #endif } else { if let url = url { - view.wrapped.sd_setImage(with: url, placeholderImage: placeholder, options: webOptions, context: webContext, progress: { (receivedSize, expectedSize, _) in - self.imageModel.progressBlock?(receivedSize, expectedSize) - }) { (image, error, cacheType, _) in - self.imageModel.image = image - if let image = image { - self.imageModel.successBlock?(image, cacheType) - } else { - self.imageModel.failureBlock?(error ?? NSError()) - } - } + loadImage(view, url: url) } } @@ -351,15 +360,6 @@ public struct AnimatedImage : PlatformViewRepresentable { // Antialiased view.shouldAntialias = imageLayout.antialiased - - // Display - #if os(macOS) - view.needsLayout = true - view.needsDisplay = true - #else - view.setNeedsLayout() - view.setNeedsDisplay() - #endif #endif } diff --git a/SDWebImageSwiftUI/Classes/ImageManager.swift b/SDWebImageSwiftUI/Classes/ImageManager.swift index 9fd3ed42..367d0d8e 100644 --- a/SDWebImageSwiftUI/Classes/ImageManager.swift +++ b/SDWebImageSwiftUI/Classes/ImageManager.swift @@ -29,17 +29,24 @@ class ImageManager : ObservableObject { } func load() { + if currentOperation != nil { + return + } currentOperation = manager.loadImage(with: url, options: options, context: context, progress: { [weak self] (receivedSize, expectedSize, _) in self?.progressBlock?(receivedSize, expectedSize) - }) { [weak self] (image, data, error, cacheType, _, _) in + }) { [weak self] (image, data, error, cacheType, finished, _) in guard let self = self else { return } if let image = image { self.image = image - self.successBlock?(image, cacheType) - } else { - self.failureBlock?(error ?? NSError()) + } + if finished { + if let image = image { + self.successBlock?(image, cacheType) + } else { + self.failureBlock?(error ?? NSError()) + } } } }