TableViewCell ImageView показывает всегда разные данные - PullRequest
0 голосов
/ 30 декабря 2018

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

Я загружаю изображение профиля со следующими строками:

func showProfilImage(uid: String, completion: @escaping (UIImage) -> Void) {
    UserApi.shared.observeUser(uid: uid) { (user) in
        guard let url = URL(string: user.profilImageUrl!) else { return }

        URLSession.shared.dataTask(with: url) { (data, response, error) in
            guard error == nil, let data = data, let image = UIImage(data: data) else { return }
                DispatchQueue.main.async {
                    let finishedImage = image.withRenderingMode(.alwaysOriginal)
                    completion(finishedImage)
                }
                }.resume()
    }
}

Затем я звоню showProfilImage в cellForRowAt со следующими строками:

self.showProfilImage(uid: self.items[indexPath.row].user.uid!) { (image) in
    cell.profilePic.image = image
}

ОБНОВЛЕНИЕ

Теперь я реализовал sdWebImage и завершил работу с URL:

func showProfilImage(uid: String, completion: @escaping (URL) -> Void) {
    UserApi.shared.observeUser(uid: uid) { (user) in
        guard let url = URL(string: user.profilImageUrl!) else { return }
        completion(url)
    }
}

Здесь я называю мой showProfilImage:

self.showProfilImage(uid: self.items[indexPath.row].user.uid!) { (url) in
            cell.profilePic.image = nil
            cell.profilePic.sd_setImage(with: url, completed: { (_, _, _, _) in
            })
        }

Ответы [ 3 ]

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

UITableView повторно использует свои представления, что означает, что когда вы загружаете изображение один раз, и ячейка выходит из экрана, UITableView возвращает ячейку обратно на экран для другого источника данных, но ранее загруженное изображение все равно будет представлено в UIImageView, чтобы добавить эту строкукод

cell.profilePic.image = nil
self.showProfilImage(uid: self.items[indexPath.row].user.uid!) { (image) in
        cell.profilePic.image = image
    }
0 голосов
/ 30 декабря 2018

В вашем текущем коде нет очереди и нет проблем с обналичиванием. Право на это - использовать SDWebImage

cell.profilePic.sd_setImage(with: URL(string:urlStr), placeholderImage: UIImage(named: "placeholder.png"))

, что-то вроде

UserApi.shared.observeUser(uid: uid) { (user) in

будетоднажды скажу в viewDidLoad

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

Если вы правильно выбираете изображение для каждого пользователя, возможно, проблема заключается в прокрутке и снятии очереди с ячейки для решения этой проблемы внутри пользовательского класса UITableViewCell. Используйте эту функцию для очистки UIImageView каждый раз, когдапроисходит снятие очереди.

override func prepareForReuse() {
        super.prepareForReuse()
        self.imageView.image = nil  //setting the image to nil  when get dequeued to reuse 
    }

Подробнее об этой функции Здесь

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