I'm using this code to load an image from a URL: Loading/Downloading image from URL on Swift. That is working fine.
I've take the code out of the viewcontroller and put it into a class. Now the image only loads when I step through the code. I'm guessing this has something to do with the code running fine but everything finishes executing before the image has completely downloaded from the web.
What piece of this am I missing so the code waits for the image without holding up any other code executing in the viewcontroller?
class MyClass:NSObject {
private var myImage:UIImage = UIImage()
func getMyImage() -> UIImage {
if let url = URL(string: self.myUrl) {
self.myImage = self.downloadImage(url: url)
}
return self.myImage
}
func getDataFromUrl(url: URL, completion: @escaping (Data?, URLResponse?, Error?) -> ()) {
URLSession.shared.dataTask(with: url) { data, response, error in
completion(data, response, error)
}.resume()
}
func downloadImage(url: URL) {
print("Download Started")
getDataFromUrl(url: url) { data, response, error in
guard let data = data, error == nil else { return }
print(response?.suggestedFilename ?? url.lastPathComponent)
print("Download Finished")
DispatchQueue.main.async() {
self.myImage = UIImage(data: data)!
}
}
}
}
//in ViewController
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
DispatchQueue.main.async() {
self.theImageView.image = self.myClass?.getImage()
}
}