Skip to content

Instantly share code, notes, and snippets.

@HarshilShah
Created September 17, 2019 15:53
Show Gist options
  • Save HarshilShah/83fb45c87e75caf35cf727e3525c9e2b to your computer and use it in GitHub Desktop.
Save HarshilShah/83fb45c87e75caf35cf727e3525c9e2b to your computer and use it in GitHub Desktop.
Generic asynchronous images in SwiftUI
protocol ImageLoader {
var image: UIImage? { get }
func fetchImage(forSize size: CGSize)
func cancelFetch()
}
struct AsyncImage<Loader: ObservableObject & ImageLoader>: View {
@ObservedObject var loader: Loader
var body: some View {
GeometryReader { reader in
Group {
if self.loader.image != nil {
Image(uiImage: self.loader.image!)
.resizable()
.scaledToFill()
.position(x: reader.size.width / 2, y: reader.size.height / 2)
.clipped()
} else {
Text("THERE'S NO FUCKEN IMAGE")
}
}
.onAppear { self.loader.fetchImage(forSize: reader.size) }
.onDisappear { self.loader.cancelFetch() }
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment