diff --git a/AsyncImageView/Renderers/RemoteImageRenderer.swift b/AsyncImageView/Renderers/RemoteImageRenderer.swift index fed3acd..34e1ba3 100644 --- a/AsyncImageView/Renderers/RemoteImageRenderer.swift +++ b/AsyncImageView/Renderers/RemoteImageRenderer.swift @@ -20,17 +20,37 @@ public protocol RemoteRenderDataType: RenderDataType { /// download the original image. /// Consider chaining this with `ImageInflaterRenderer`. public final class RemoteImageRenderer: RendererType { - private let session: URLSession + private let renderer: RemoteImageDataRenderer public init(session: URLSession = URLSession.shared) { - self.session = session + self.renderer = RemoteImageDataRenderer(session: session) { UIImage(data: $0) } } public func renderImageWithData(_ data: T) -> SignalProducer { + return self.renderer.renderImageWithData(data) + } +} + +/// `RendererType` which downloads encoded image data and decodes it into a custom render result. +public final class RemoteImageDataRenderer: RendererType { + public typealias Decoder = (Data) -> Result? + + private let session: URLSession + private let decoder: Decoder + + public init( + session: URLSession = URLSession.shared, + decoder: @escaping Decoder + ) { + self.session = session + self.decoder = decoder + } + + public func renderImageWithData(_ data: T) -> SignalProducer { return self.session.reactive.data(with: URLRequest(url: data.imageURL)) .mapError(RemoteImageRendererError.loadingError) .attemptMap { (data, response) in - Result( + Swift.Result( (response as? HTTPURLResponse).map { (data, $0) }, failWith: .invalidResponse ) @@ -47,10 +67,10 @@ public final class RemoteImageRenderer: RendererType { } } .observe(on: QueueScheduler()) - .flatMap(.merge) { data in + .flatMap(.merge) { [decoder = self.decoder] data in return SignalProducer { - Result( - UIImage(data: data), + Swift.Result( + decoder(data), failWith: RemoteImageRendererError.decodingError ) }