Skip to content

Instantly share code, notes, and snippets.

@eunice730711
Created September 28, 2021 09:56
Show Gist options
  • Save eunice730711/4e068edfe1ab0bae15a26c9904852981 to your computer and use it in GitHub Desktop.
Save eunice730711/4e068edfe1ab0bae15a26c9904852981 to your computer and use it in GitHub Desktop.
Load Remote URL into Image
import SwiftUI
import Combine
struct ContentView: View {
var body: some View {
RemoteImageView(withImageURL: "https://i.imgur.com/SbqZHV2.jpg")
}
}
struct RemoteImageView: View {
@ObservedObject var imageLoader:RemoteImageLoader
@State var image: UIImage = UIImage()
init(withImageURL url:String) {
imageLoader = RemoteImageLoader(imageUrlString: url)
}
var body: some View {
Image(uiImage: image)
.resizable()
.aspectRatio(contentMode: .fit)
.frame(width: 200, height: 200)
.onReceive(imageLoader.didChange) { data in
self.image = UIImage(data: data) ?? UIImage()
}
}
}
class RemoteImageLoader: ObservableObject {
var didChange = PassthroughSubject<Data, Never>()
var data = Data() {
didSet {
didChange.send(data)
}
}
init(imageUrlString: String) {
guard let url = URL(string: imageUrlString) else { return }
let task = URLSession.shared.dataTask(with: url) { data, response, error in
guard let data = data else { return }
DispatchQueue.main.async {
self.data = data
}
}
task.resume()
}
}
struct ContentView_Previews: PreviewProvider {
static var previews: some View {
ContentView()
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment