Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
32 changes: 26 additions & 6 deletions AsyncImageView/Renderers/RemoteImageRenderer.swift
Original file line number Diff line number Diff line change
Expand Up @@ -20,17 +20,37 @@ public protocol RemoteRenderDataType: RenderDataType {
/// download the original image.
/// Consider chaining this with `ImageInflaterRenderer`.
public final class RemoteImageRenderer<T: RemoteRenderDataType>: RendererType {
private let session: URLSession
private let renderer: RemoteImageDataRenderer<T, UIImage>

public init(session: URLSession = URLSession.shared) {
self.session = session
self.renderer = RemoteImageDataRenderer(session: session) { UIImage(data: $0) }
}

public func renderImageWithData(_ data: T) -> SignalProducer<UIImage, RemoteImageRendererError> {
return self.renderer.renderImageWithData(data)
}
}

/// `RendererType` which downloads encoded image data and decodes it into a custom render result.
public final class RemoteImageDataRenderer<T: RemoteRenderDataType, Result: RenderResultType>: 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<Result, RemoteImageRendererError> {
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
)
Expand All @@ -47,10 +67,10 @@ public final class RemoteImageRenderer<T: RemoteRenderDataType>: 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
)
}
Expand Down
Loading