Загрузка изображения с сервера в виде коллекции - PullRequest
0 голосов
/ 01 октября 2018

Я пробовал так много способов загрузить изображение с сервера в режиме просмотра коллекции, но при прокрутке все еще существует задержка!

это мой ImageProvider класс:

let imageCache = NSCache<AnyObject, AnyObject>()

class ImageProvider: UIImageView {

    var imageUrl: String?

    func loadImage(from urlString: String) {
        self.imageUrl = urlString
        let url = URL(string: urlString)!
        image = nil

        if let imageFromCache = imageCache.object(forKey: urlString as AnyObject) as? UIImage {
            self.image = imageFromCache
            return
        }

        URLSession.shared.dataTask(with: url) { (data, request, error) in
            if error != nil {
                print(error!)
                return
            }
            DispatchQueue.main.async {
                let imageToCache = UIImage(data: data!)
                if self.imageUrl == urlString {
                    self.image = imageToCache
                }
                imageCache.setObject(imageToCache!, forKey: urlString as AnyObject)
            }
        }.resume()
    }
}

настройка данных:

func setupCVData(cell: TrackCell, item: Audio) {
        cell.title.text = item.name
        cell.url = URL(string: item.url!)!
        if let url = cell.url {
            var imageLink = String()
            (_, _, imageLink) = fetcher.getData(from: url)
            cell.imageUrl = imageLink
            cell.updateImageView()
        }
    }

и updateImageView функция:

func updateImageView() {
        self.artwork.loadImage(from: imageUrl)
    }

Я пытался вызвать setupCVData в collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) и collectionView(_ collectionView: UICollectionView, willDisplay cell: UICollectionViewCell, forItemAt indexPath: IndexPath)

Я тоже использовал SDWebImage без везения!

Так что же я тут не так делаю?Я не могу понять проблему.

1 Ответ

0 голосов
/ 01 октября 2018

Насколько я знаю, вам не нужно создавать объект UIImage в главном потоке.Я обычно создаю UIImages в фоновых потоках без каких-либо проблем.Однако элементы пользовательского интерфейса следует изменять только в основном потоке.Поэтому, когда вы устанавливаете свойство изображения UIImageView, убедитесь, что это сделано в главном потоке.

let imageToCache = UIImage(data: data!)
imageCache.setObject(imageToCache!, forKey: urlString as AnyObject)
DispatchQueue.main.async {
    if self.imageUrl == urlString {
       self.image = imageToCache
    }            
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...