我遇到了填充细胞的问题。当滚动速度非常快时,单元格会在找到正确的图像之前经过2-3张图像。我加载了一个包含1000个项目的JSON的数组,并使用它们中的URL来获取具有此扩展名的图像:
extension UIImageView {
func downloadedFrom(url: URL, contentMode mode: UIViewContentMode = .scaleAspectFill) {
contentMode = mode
URLSession.shared.dataTask(with: url) { data, response, error in
guard
let httpURLResponse = response as? HTTPURLResponse, httpURLResponse.statusCode == 200,
let mimeType = response?.mimeType, mimeType.hasPrefix("image"),
let data = data, error == nil,
let image = UIImage(data: data)
else { return }
DispatchQueue.main.async() {
self.image = image
}
}.resume()
}
func downloadedFrom(link: String, contentMode mode: UIViewContentMode = .scaleAspectFill) {
guard let url = URL(string: link) else { return }
downloadedFrom(url: url, contentMode: mode)
}
除了上面的问题,这一切都很有效。但我也想知道是否有更好的方法来加载数组中的一些项目,然后在滚动时追加更多?我应该提一下,我的fetchData函数,还包含数组函数的追加。
非常感谢。
答案 0 :(得分:0)
当滚动速度非常快时,2-3个图像正在发生变化,因为您可能正在使用dequeReusableCells函数,这意味着正在重复使用单元格。如您所述,您加载了一个包含1000个项目的数组。诀窍是使用分页首先获取10个或20个项目,然后滚动到底部获取下一个10或20。 为此,您可能需要调整API以满足您的要求。如果您正在使用集合视图,此功能将帮助您检测是否已到达集合视图的末尾,是时候获取下一个10或20个项目。
public func collectionView(_ collectionView: UICollectionView, willDisplay cell: UICollectionViewCell, forItemAt indexPath: IndexPath){}
答案 1 :(得分:0)
您可以覆盖此方法......
override func prepareForReuse() {
super.prepareForReuse()
//hide or reset anything you want hereafter, for example
imgView.image = nil //whatever
}