From 8bdff690cd7fdd67c1d4ea556243431533b48060 Mon Sep 17 00:00:00 2001 From: NachoSoto Date: Fri, 24 Jul 2026 07:30:39 -0700 Subject: [PATCH] Constrain Swift 6 concurrency escapes --- AsyncImageView/AsyncImageView.swift | 2 +- AsyncImageView/Renderers/ViewRenderer.swift | 13 ++++++++++--- 2 files changed, 11 insertions(+), 4 deletions(-) diff --git a/AsyncImageView/AsyncImageView.swift b/AsyncImageView/AsyncImageView.swift index 623b962..d6d9e10 100644 --- a/AsyncImageView/AsyncImageView.swift +++ b/AsyncImageView/AsyncImageView.swift @@ -39,7 +39,7 @@ open class AsyncImageView< private let imageCreationScheduler: ReactiveSwift.Scheduler - private var disposable: Disposable? + nonisolated(unsafe) private var disposable: Disposable? public init( initialFrame: CGRect, diff --git a/AsyncImageView/Renderers/ViewRenderer.swift b/AsyncImageView/Renderers/ViewRenderer.swift index f1e474f..99922a7 100644 --- a/AsyncImageView/Renderers/ViewRenderer.swift +++ b/AsyncImageView/Renderers/ViewRenderer.swift @@ -88,6 +88,9 @@ fileprivate func createProducer( renderBlock: @escaping @MainActor (UIView) -> UIImage ) -> SignalProducer { return SignalProducer { observer, lifetime in + let observer = UncheckedSendableBox(value: observer) + let lifetime = UncheckedSendableBox(value: lifetime) + MainActor.assumeIsolated { let view = viewCreationBlock(data) view.frame.origin = .zero @@ -98,9 +101,9 @@ fileprivate func createProducer( // We can't take a snapshot right away because the view has not been commited to the render server yet. UIScheduler().schedule { MainActor.assumeIsolated { - if !lifetime.hasEnded { - observer.send(value: renderBlock(view)) - observer.sendCompleted() + if !lifetime.value.hasEnded { + observer.value.send(value: renderBlock(view)) + observer.value.sendCompleted() } } } @@ -114,4 +117,8 @@ fileprivate func draw(view: UIView, inContext context: CGContext) { view.layer.render(in: context) } +fileprivate struct UncheckedSendableBox: @unchecked Sendable { + let value: Value +} + #endif