Code: Select all
class DetailViewModel {
var countryCode : String?
public func getImageURL(with completion: @escaping (String) -> Void) {
APIHandler.getDataForCountryImage(for: countryCode!) { result in
print("result is \(result)")
completion(result.data.flagImageUri)
}
}
}
Ich initialisiere meinen viewController mit dem viewModel wie folgt:
Code: Select all
private var viewModel: DetailViewModel
//MARK: - LifeCycle
init(with viewModel: DetailViewModel) {
self.viewModel = viewModel
super.init(nibName: nil, bundle: nil)
}
Code: Select all
private func setCountryFlagImage() {
self.viewModel.getImageURL { [weak self] imageURL in
print("image url is \(imageURL)")
let url = URL(string: imageURL)
DispatchQueue.main.async {
self?.countryImage.load(url: url!)
}
}
}
Innerhalb der Dispatchque verwende ich grundsätzlich die UIImageView-Erweiterung, die ich unten geschrieben habe. countryImage ist die UIImageView, deren Bild ich aktualisieren möchte.
Code: Select all
extension UIImageView {
func load(url: URL) {
URLSession.shared.dataTask(with: url) { data, response, error in
if error == nil {
guard
let httpURLResponse = response as? HTTPURLResponse, httpURLResponse.statusCode == 200,
let mimeType = response?.mimeType, mimeType.hasPrefix("image"),
let data = data, error == nil,
let image = UIImage(data: data) else { return }
DispatchQueue.main.async { [weak self] in
print("dispatch")
self?.image = image
}
}
else {
print("error is \(error)")
}
}.resume()
}
}
Im Erweiterungsblock des Codes sehe ich nie die print("dispatch")-Anweisung und Dies geschieht, weil ich let image = UIImage(data: data)
Was übersehe ich hier nicht?