Swift and JSON url Изображение, отредактировано - PullRequest
0 голосов
/ 26 марта 2020

Так что это код, который я использую для создания моего представления таблицы с нуля. У меня вопрос, как я могу разобрать изображение, если изображение имеет формат строки (URL)?

class ArticleCell : UITableViewCell {
var article: Article? {
    didSet {
        articleTitle.text = article?.title
        //articleImage.image = article?.urlToImage
        descriptionTitle.text = article?.description
    }
}

private let articleTitle : UILabel = {
    let lbl = UILabel()
    lbl.textColor = .black
    lbl.font = UIFont.boldSystemFont(ofSize: 20)
    lbl.textAlignment = .left
    return lbl
}()

private let descriptionTitle : UILabel = {
    let desclbl = UILabel()
    desclbl.textColor = .black
    desclbl.font = UIFont.boldSystemFont(ofSize: 10)
    desclbl.textAlignment = .left
    return desclbl
}()

override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?) {
    super.init(style: style, reuseIdentifier: reuseIdentifier)
    addSubview(articleTitle)
    addSubview(descriptionTitle) 

Потому что тогда я хотел бы сделать следующее:

addsubview(articleImage)

Я получаю ошибка, поскольку я объявляю изображение, но оно в строковом формате. Теперь использовать раскадровку легко, но программно у меня есть эта проблема.

Теперь это более понятно? Мне очень жаль, если я сделал путаницу.

1 Ответ

0 голосов
/ 28 марта 2020

Чтобы загрузить изображение из 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 (), чтобы сообщить ячейке, что ей нужно настроить макет своих подпредставлений.

ПРИМЕЧАНИЕ. Приведенное выше решение работает, если вы отображаете очень мало ячеек. Если вы отображаете МНОЖЕСТВО ячеек в своем табличном представлении и хотите прокручивать их во время загрузки, вы столкнетесь с давней проблемой загрузки содержимого ячейки (в данном случае изображения) по неверному пути индекса. Я предлагаю прочитать в , как асинхронно загружать изображения в представления таблиц и коллекций . Веселись!

...