Konvertieren einer Zeichenfolge einer Bild-URL der API in UIImage
Posted: 18 Jan 2025, 22:55
Ich versuche, eine URL-Zeichenfolge zu konvertieren, die ich von der API erhalte. Ich erhalte die URL für die API in meiner ModelView wie folgt:
Die obige print-Anweisung gibt die URL erfolgreich als Zeichenfolge aus. Es ist also kein Problem, die URL als Zeichenfolge zu erhalten.
Ich initialisiere meinen viewController mit dem viewModel wie folgt:
und versuche, den Bild-URL-String, den ich von modelView erhalten habe, mit dem folgenden Code in UIImage zu konvertieren:
Diese Funktion druckt auch die Anweisung print("image url is (imageURL)") mit der zugehörigen URL als Zeichenfolge.
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.
Wenn ich den Code ausführe, kann ich die Druckanweisung von setCountryFlagImage im Terminal sehen, aber zusätzlich gibt es eine Warnung: "[boringssl] Boringssl_metrics_log_metric_block_invoke(144)" aber ich denke, das könnte für mein Problem irrelevant sein.
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?
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?