From b3b5f764557f6e90e8433342b67085dc780f8bb8 Mon Sep 17 00:00:00 2001 From: NachoSoto Date: Sun, 30 Nov 2025 10:25:52 +0900 Subject: [PATCH] Preserve cache hit information after inflating images --- .../Renderers/ImageInflaterRenderer.swift | 39 +++++++++++-------- 1 file changed, 23 insertions(+), 16 deletions(-) diff --git a/AsyncImageView/Renderers/ImageInflaterRenderer.swift b/AsyncImageView/Renderers/ImageInflaterRenderer.swift index d6735ee8..a352c145 100644 --- a/AsyncImageView/Renderers/ImageInflaterRenderer.swift +++ b/AsyncImageView/Renderers/ImageInflaterRenderer.swift @@ -11,35 +11,42 @@ import UIKit import ReactiveSwift /// `RendererType` decorator that inflates images. -public final class ImageInflaterRenderer< - Data: RenderDataType, RenderResult: RenderResultType, Error: Swift.Error ->: RendererType { +public final class ImageInflaterRenderer: RendererType { public typealias ContentMode = ImageInflaterRendererContentMode - + public typealias Data = Renderer.Data + public typealias Error = Renderer.Error + public typealias RenderResult = ImageResult + + private let renderer: Renderer private let screenScale: CGFloat private let opaque: Bool - private let renderBlock: (Data) -> SignalProducer private let contentMode: ContentMode - public init( + public init( renderer: Renderer, screenScale: CGFloat, opaque: Bool, contentMode: ContentMode = .defaultMode - ) where Renderer.Data == Data, Renderer.RenderResult == RenderResult, Renderer.Error == Error { + ) { + self.renderer = renderer self.screenScale = screenScale self.opaque = opaque - self.renderBlock = renderer.renderImageWithData self.contentMode = contentMode } - public func renderImageWithData(_ data: Data) -> SignalProducer { - return self.renderBlock(data) - .map { [scale = self.screenScale] result in - return result.image.inflate(withSize: data.size, - scale: scale, - opaque: self.opaque, - contentMode: self.contentMode) + public func renderImageWithData(_ data: Data) -> SignalProducer { + return self.renderer.renderImageWithData(data) + .map { [screenScale = self.screenScale, + opaque = self.opaque, + contentMode = self.contentMode] result in + let inflatedImage = result.image.inflate( + withSize: data.size, + scale: screenScale, + opaque: opaque, + contentMode: contentMode + ) + + return ImageResult(image: inflatedImage, cacheHit: result.cacheHit) } .start(on: QueueScheduler()) } @@ -133,7 +140,7 @@ extension RendererType { _ screenScale: CGFloat, opaque: Bool, contentMode: ImageInflaterRendererContentMode = .defaultMode - ) -> ImageInflaterRenderer { + ) -> ImageInflaterRenderer { return ImageInflaterRenderer(renderer: self, screenScale: screenScale, opaque: opaque,