From 4c456e1850e655cdd06dd085d1f7828b8880183c Mon Sep 17 00:00:00 2001 From: DreamPiggy Date: Thu, 24 Oct 2019 12:26:55 +0800 Subject: [PATCH 1/2] Check the current operation and avoid extra query, this can increase performance, even SDWebImage does not query multiple times --- SDWebImageSwiftUI/Classes/AnimatedImage.swift | 29 ++++++++++++------- SDWebImageSwiftUI/Classes/ImageManager.swift | 15 +++++++--- 2 files changed, 30 insertions(+), 14 deletions(-) diff --git a/SDWebImageSwiftUI/Classes/AnimatedImage.swift b/SDWebImageSwiftUI/Classes/AnimatedImage.swift index da63db90..dd76bb9b 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) } } 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()) + } } } } From cbf42786f612661d6bc59c30482d48b973a2921f Mon Sep 17 00:00:00 2001 From: DreamPiggy Date: Thu, 24 Oct 2019 12:28:01 +0800 Subject: [PATCH 2/2] Don't need to setNeedsDisplay on SwiftUI representable, because SwfitUI will do this automatically --- SDWebImageSwiftUI/Classes/AnimatedImage.swift | 9 --------- 1 file changed, 9 deletions(-) diff --git a/SDWebImageSwiftUI/Classes/AnimatedImage.swift b/SDWebImageSwiftUI/Classes/AnimatedImage.swift index dd76bb9b..3ed4aa34 100644 --- a/SDWebImageSwiftUI/Classes/AnimatedImage.swift +++ b/SDWebImageSwiftUI/Classes/AnimatedImage.swift @@ -360,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 }