Настройка изображения для tableviewcell замедляет прокрутку в Swift - PullRequest
0 голосов
/ 08 декабря 2018

Жезл, чтобы загрузить изображение из URL и установить его для ячейки табличного представления.Если я делаю это без асинхронности, это замедляет просмотр таблицы.В противном случае, если я установлю в асинхронном блоке, некоторые изображения будут отображаться неправильно, и они будут изменены асинхронно.

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

DispatchQueue.global(qos: .userInitiated).async {
                var userPhoto: UIImage?

                if let imageUrl = participant?.image {
                    let url = URL(string:imageUrl)
                    if let data = try? Data(contentsOf: url!)
                    {
                        userPhoto = UIImage(data: data)
                    }
                }

                DispatchQueue.main.async {
                    if let userPhoto = userPhoto {
                        self.imageViewOwner.image = userPhoto
                    } else {
                        // Sets default image for profile.
                        self.imageViewOwner.image = UIImage(named: "default")
                    }
                }

            }

Ответы [ 2 ]

0 голосов
/ 08 декабря 2018

Правильный способ сделать это "асинхронно".

Я бы посоветовал создать отдельный класс, чтобы использовать DownloadingService для инициирования запросов изображения, отслеживая, какое изображение уже загружено, а какоеis not.

Заставьте ваш View Controller (или любой другой объект, являющийся вашим источником данных табличного представления) использовать объект выше для получения объекта изображения (из памяти или из дискового кэша; вам, вероятно, следует кэшировать изображения после загрузки).Если этот объект недоступен - просто используйте какое-либо изображение по умолчанию везде (это может быть изображение индикатора загрузки, изображение аватара пользователя и т. Д.).

Возможно, вам придется создать собственную ячейку и переопределить prepareForReuse() метод.Установите там изображение по умолчанию для ячейки, и оно не будет отображать старые / неправильные изображения в ячейках, если текущая загрузка все еще продолжается во время отображения ячейки.

Примечание. Используете ли вы открытуюИсходная библиотека или нет, шаги одинаковы.

0 голосов
/ 08 декабря 2018

Вы можете попробовать SDWebImage

self.imageViewOwne.sd_setImage(with: URL(string:imageUrl), placeholderImage: UIImage(named: "default"))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...