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