Код: Выделить всё
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)
}
}
}
Я инициализирую свой viewController с помощью viewModel, как показано ниже:
Код: Выделить всё
private var viewModel: DetailViewModel
//MARK: - LifeCycle
init(with viewModel: DetailViewModel) {
self.viewModel = viewModel
super.init(nibName: nil, bundle: nil)
}
Код: Выделить всё
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!)
}
}
}
Внутри диспетчерского запроса я в основном использую расширение UIImageView, которое написал ниже. countryImage — это UIImageView, изображение которого я хочу обновить.
Код: Выделить всё
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()
}
}
В блоке расширения кода я никогда не вижу print("dispatch") и это происходит потому, что я не могу защитить let image = UIImage(data: data)
Что мне здесь не хватает?
Подробнее здесь: https://stackoverflow.com/questions/701 ... to-uiimage
Мобильная версия