From 51b8d7f681b29454b8cd1ebda77b5ca6f50a8864 Mon Sep 17 00:00:00 2001 From: Igor Ferreira Date: Fri, 9 Sep 2022 17:56:47 +0200 Subject: [PATCH] Improve concurrency --- Sources/GIFImage.swift | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/Sources/GIFImage.swift b/Sources/GIFImage.swift index 9cc85e4..92f015c 100644 --- a/Sources/GIFImage.swift +++ b/Sources/GIFImage.swift @@ -81,12 +81,10 @@ public struct GIFImage: View { } private func handle(loop: Bool) { - guard loop else { return } - Task { await load() } + if loop { load() } } - @Sendable - private func load() async { + @Sendable private func load() { presentationTask?.cancel() presentationTask = Task { do { @@ -97,14 +95,13 @@ public struct GIFImage: View { try await action(source) } while(self.loop) } catch { - frame = errorImage ?? placeholder + await setFrame(errorImage ?? placeholder) } } } - @Sendable - private func update(_ imageFrame: ImageFrame) async throws { - frame = RawImage.create(with: imageFrame.image) + @Sendable private func update(_ imageFrame: ImageFrame) async throws { + await setFrame(RawImage.create(with: imageFrame.image)) let calculatedInterval = imageFrame.interval ?? kDefaultGIFFrameInterval let interval: Double switch frameRate { @@ -118,6 +115,11 @@ public struct GIFImage: View { } try await Task.sleep(nanoseconds: UInt64(interval * 1_000_000_000.0)) } + + @MainActor + @Sendable private func setFrame(_ frame: RawImage) async { + self.frame = frame + } } struct GIFImage_Previews: PreviewProvider {