Skip to content

Commit a9fa353

Browse files
committed
Refactory code to fix that calling sd_setImage(with:) multiple times issues
1 parent bdbf0a5 commit a9fa353

File tree

1 file changed

+48
-23
lines changed

1 file changed

+48
-23
lines changed

SDWebImageSwiftUI/Classes/AnimatedImage.swift

Lines changed: 48 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,6 @@ import SDWebImage
1212
// Data Binding Object
1313
final class AnimatedImageModel : ObservableObject {
1414
@Published var image: PlatformImage?
15-
@Published var url: URL?
1615
@Published var successBlock: ((PlatformImage, SDImageCacheType) -> Void)?
1716
@Published var failureBlock: ((Error) -> Void)?
1817
@Published var progressBlock: ((Int, Int) -> Void)?
@@ -52,6 +51,7 @@ public struct AnimatedImage : PlatformViewRepresentable {
5251
@ObservedObject var imageLayout = AnimatedImageLayout()
5352
@ObservedObject var imageConfiguration = AnimatedImageConfiguration()
5453

54+
var url: URL?
5555
var placeholder: PlatformImage?
5656
var webOptions: SDWebImageOptions = []
5757
var webContext: [SDWebImageContextOption : Any]? = nil
@@ -80,7 +80,7 @@ public struct AnimatedImage : PlatformViewRepresentable {
8080
self.placeholder = placeholder
8181
self.webOptions = options
8282
self.webContext = context
83-
self.imageModel.url = url
83+
self.url = url
8484
}
8585

8686
/// Create an animated image with name and bundle.
@@ -174,19 +174,23 @@ public struct AnimatedImage : PlatformViewRepresentable {
174174
}
175175

176176
func updateView(_ view: AnimatedImageViewWrapper, context: PlatformViewRepresentableContext<AnimatedImage>) {
177-
#if os(watchOS)
178-
view.wrapped.setImage(imageModel.image)
179-
#else
180-
view.wrapped.image = imageModel.image
181-
#endif
182-
if let url = imageModel.url {
183-
view.wrapped.sd_setImage(with: url, placeholderImage: placeholder, options: webOptions, context: webContext, progress: { (receivedSize, expectedSize, _) in
184-
self.imageModel.progressBlock?(receivedSize, expectedSize)
185-
}) { (image, error, cacheType, _) in
186-
if let image = image {
187-
self.imageModel.successBlock?(image, cacheType)
188-
} else {
189-
self.imageModel.failureBlock?(error ?? NSError())
177+
if let image = imageModel.image {
178+
#if os(watchOS)
179+
view.wrapped.setImage(image)
180+
#else
181+
view.wrapped.image = image
182+
#endif
183+
} else {
184+
if let url = url {
185+
view.wrapped.sd_setImage(with: url, placeholderImage: placeholder, options: webOptions, context: webContext, progress: { (receivedSize, expectedSize, _) in
186+
self.imageModel.progressBlock?(receivedSize, expectedSize)
187+
}) { (image, error, cacheType, _) in
188+
self.imageModel.image = image
189+
if let image = image {
190+
self.imageModel.successBlock?(image, cacheType)
191+
} else {
192+
self.imageModel.failureBlock?(error ?? NSError())
193+
}
190194
}
191195
}
192196
}
@@ -236,22 +240,22 @@ public struct AnimatedImage : PlatformViewRepresentable {
236240
view.wrapped.imageScaling = .scaleProportionallyUpOrDown
237241
#elseif os(iOS) || os(tvOS)
238242
view.wrapped.contentMode = .scaleAspectFit
239-
#else
243+
#elseif os(watchOS)
240244
view.wrapped.setContentMode(.aspectFit)
241245
#endif
242246
case .fill:
243247
#if os(macOS)
244248
view.wrapped.imageScaling = .scaleAxesIndependently
245249
#elseif os(iOS) || os(tvOS)
246250
view.wrapped.contentMode = .scaleToFill
247-
#else
251+
#elseif os(watchOS)
248252
view.wrapped.setContentMode(.fill)
249253
#endif
250254
}
251255

252-
#if os(macOS) || os(iOS) || os(tvOS)
253256
// Animated Image does not support resizing mode and rendering mode
254-
if let image = view.wrapped.image, !image.sd_isAnimated, !image.conforms(to: SDAnimatedImageProtocol.self) {
257+
if let image = imageModel.image, !image.sd_isAnimated, !image.conforms(to: SDAnimatedImageProtocol.self) {
258+
var image = image
255259
// ResizingMode
256260
if let resizingMode = imageLayout.resizingMode {
257261
#if os(macOS)
@@ -265,14 +269,24 @@ public struct AnimatedImage : PlatformViewRepresentable {
265269
view.wrapped.image?.resizingMode = .stretch
266270
view.wrapped.image?.capInsets = capInsets
267271
#else
268-
view.wrapped.image = view.wrapped.image?.resizableImage(withCapInsets: capInsets, resizingMode: .stretch)
272+
image = image.resizableImage(withCapInsets: capInsets, resizingMode: .stretch)
273+
#if os(iOS) || os(tvOS)
274+
view.wrapped.image = image
275+
#elseif os(watchOS)
276+
view.wrapped.setImage(image)
277+
#endif
269278
#endif
270279
case .tile:
271280
#if os(macOS)
272281
view.wrapped.image?.resizingMode = .tile
273282
view.wrapped.image?.capInsets = capInsets
274283
#else
275-
view.wrapped.image = view.wrapped.image?.resizableImage(withCapInsets: capInsets, resizingMode: .tile)
284+
image = image.resizableImage(withCapInsets: capInsets, resizingMode: .tile)
285+
#if os(iOS) || os(tvOS)
286+
view.wrapped.image = image
287+
#elseif os(watchOS)
288+
view.wrapped.setImage(image)
289+
#endif
276290
#endif
277291
@unknown default:
278292
// Future cases, not implements
@@ -287,13 +301,23 @@ public struct AnimatedImage : PlatformViewRepresentable {
287301
#if os(macOS)
288302
view.wrapped.image?.isTemplate = true
289303
#else
290-
view.wrapped.image = view.wrapped.image?.withRenderingMode(.alwaysTemplate)
304+
image = image.withRenderingMode(.alwaysTemplate)
305+
#if os(iOS) || os(tvOS)
306+
view.wrapped.image = image
307+
#elseif os(watchOS)
308+
view.wrapped.setImage(image)
309+
#endif
291310
#endif
292311
case .original:
293312
#if os(macOS)
294313
view.wrapped.image?.isTemplate = false
295314
#else
296-
view.wrapped.image = view.wrapped.image?.withRenderingMode(.alwaysOriginal)
315+
image = image.withRenderingMode(.alwaysOriginal)
316+
#if os(iOS) || os(tvOS)
317+
view.wrapped.image = image
318+
#elseif os(watchOS)
319+
view.wrapped.setImage(image)
320+
#endif
297321
#endif
298322
@unknown default:
299323
// Future cases, not implements
@@ -302,6 +326,7 @@ public struct AnimatedImage : PlatformViewRepresentable {
302326
}
303327
}
304328

329+
#if os(macOS) || os(iOS) || os(tvOS)
305330
// Interpolation
306331
if let interpolation = imageLayout.interpolation {
307332
switch interpolation {

0 commit comments

Comments
 (0)