Skip to content
Open
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
49 changes: 43 additions & 6 deletions AsyncImageView/AsyncImageView.swift
Original file line number Diff line number Diff line change
Expand Up @@ -31,8 +31,45 @@ open class AsyncImageView<
PlaceholderRenderer.Error == NoError,
Renderer.RenderResult == PlaceholderRenderer.RenderResult
{
private let requestsSignal: Signal<Data?, NoError>
private let requestsObserver: Signal<Data?, NoError>.Observer
public enum Display {
case empty
case placeholder
case data(ImageViewData)

fileprivate func renderDataWithSize(_ size: CGSize) -> DataDisplay {
switch self {
case .empty:
return .empty
case .placeholder:
return .placeholder
case let .data(data):
return .data(data.renderDataWithSize(size))
}
}
}

fileprivate enum DataDisplay: Equatable {
case empty
case placeholder
case data(Data)

static func == (lhs: DataDisplay, rhs: DataDisplay) -> Bool {
switch (lhs, rhs) {
case (.empty, .empty):
return true
case (.placeholder, .placeholder):
return true
case let (.data(lhs), .data(rhs)):
return lhs == rhs

default:
return false
}
}
}

private let requestsSignal: Signal<DataDisplay, NoError>
private let requestsObserver: Signal<DataDisplay, NoError>.Observer

private let imageCreationScheduler: Scheduler

Expand All @@ -56,7 +93,7 @@ open class AsyncImageView<
.on(value: { [weak self] in
if
let strongSelf = self,
placeholderRenderer == nil || $0 == nil {
placeholderRenderer == nil || $0 == .empty {
strongSelf.resetImage()
}
})
Expand Down Expand Up @@ -98,7 +135,7 @@ open class AsyncImageView<
}
}

public final var data: ImageViewData? {
public final var data: Display {
didSet {
self.requestNewImageIfReady()
}
Expand All @@ -117,10 +154,10 @@ open class AsyncImageView<
}
}

private func requestNewImage(_ size: CGSize, data: ImageViewData?) {
private func requestNewImage(_ size: CGSize, data: Display) {
self.imageCreationScheduler.schedule { [weak instance = self, observer = self.requestsObserver] in
if instance != nil {
observer.send(value: data?.renderDataWithSize(size))
observer.send(value: data.renderDataWithSize(size))
}
}
}
Expand Down