Чтобы загрузить изображение из URL (или строки), нам сначала нужно сделать следующее:
guard let urlToImage = article?.urlToImage, let urlContent = URL(string: urlToImage) else { return }
if let data = try? Data(contentsOf: urlContent) {
if let image = UIImage(data: data) {
articleImage.image = image
}
}
}
Однако это создает ужасный пользовательский интерфейс для пользователя, так как загрузка изображения из URL синхронно будет задерживаться. вверх по нашему главному потоку, и все остальные в очереди будут застревать в ожидании загрузки изображения до конца sh.
Ради пользователя, давайте установим заголовок и описание так долго, но отправим загрузку изображения в некоторый фоновый поток. Это должно выглядеть примерно так:
var article: Article? {
didSet {
articleTitle.text = article?.title
descriptionTitle.text = article?.description
guard let urlToImage = article?.urlToImage, let urlContent = URL(string: urlToImage) else { return }
DispatchQueue.global().async {
if let data = try? Data(contentsOf: urlContent) {
if let image = UIImage(data: data) {
DispatchQueue.main.async { [weak self] in
self?.articleImage.image = image
self?.setNeedsLayout()
}
}
}
}
}
}
Когда у нас будет наше изображение, мы снова устанавливаем его в главном потоке и вызываем setNeedsLayout (), чтобы сообщить ячейке, что ей нужно настроить макет своих подпредставлений.
ПРИМЕЧАНИЕ. Приведенное выше решение работает, если вы отображаете очень мало ячеек. Если вы отображаете МНОЖЕСТВО ячеек в своем табличном представлении и хотите прокручивать их во время загрузки, вы столкнетесь с давней проблемой загрузки содержимого ячейки (в данном случае изображения) по неверному пути индекса. Я предлагаю прочитать в , как асинхронно загружать изображения в представления таблиц и коллекций . Веселись!