Загрузка изображения автоматически при запуске Swift tableview - PullRequest
0 голосов
/ 30 апреля 2018

У меня очень маленькая проблема ... Я сделал приложение для RSS-канала, и при открытии у меня есть список всех статей, но изображения не загружаются, пока я не начну прокручивать канал.

Код, который я использовал для загрузки картинок и добавления их к каждой ячейке таблицы, следующий:

let task = URLSession.shared.dataTask(with: url!) { data, response, error in
            guard let data = data, error == nil else { return }

            DispatchQueue.main.async() {
                // execute on main thread
                cell.imageView?.image = UIImage(data: data, scale: 12)
                //cell.imageView?.image = UIImage(data: data)
            }
        }

        task.resume()

Я вставляю этот код внутри:

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell

Заранее спасибо.

EDIT

Я нашел возможное решение, но когда я его внедряю, приложение становится немного медленным:

if let data = NSData(contentsOf: url!){
            cell.imageView?.image = UIImage(data: data as Data, scale: 12)
        }

Ответы [ 3 ]

0 голосов
/ 30 апреля 2018

Используйте SDWebImage библиотеку и импортируйте ее в свой класс

cell.yourImageView!.sd_setImage(with: yourImageURL, placeholderImage: UIImage(named: "placeHolderImageName") , options: .continueInBackground, completed: nil)

Он загрузит и автоматически загрузит ваши изображения в ячейку таблицы imageView. Просто укажите фиктивное изображение placeHolder для размещения в imageView, пока ваше изображение загружается.

0 голосов
/ 30 апреля 2018
You can use this line  guard let cell = tableView.cellForRow(at: indexPath) else { return } as follow.

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: "cell")
        let task = URLSession.shared.dataTask(with: url!) { data, response, error in
                guard let data = data, error == nil else { return }


                DispatchQueue.main.async() {
guard let cell = tableView.cellForRow(at: indexPath) else { return }
                    // execute on main thread
                    cell.imageView?.image = UIImage(data: data, scale: 12)
                    //cell.imageView?.image = UIImage(data: data)
                }
            }

            task.resume()

        }

The purpose of the line is to check if the cell is visible on the screen or not. If visible in that case it will plot the image on the cell's image view else guard statement return from the .cellForRow(IndexPath)
0 голосов
/ 30 апреля 2018

Пожалуйста, пройдите определение метода источника данных cellForRowAt. Этот метод будет вызываться только тогда, когда он появится на дисплее. В это время изображение загрузится.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...