Здравствуйте, я работаю, чтобы получить решение с 15 дней. Искал везде, но не избавился от этой проблемы. У меня есть каналы, чтобы показать в моем UITableView. И я кеширую изображения. Я загружаю изображения из FireBase. Один канал содержит более одного изображения. Поэтому я использую Горизонтальная прокрутка и добавляю к ней изображения.
Я также использую нумерацию страниц для получения каналов из firestore . Проблема заключается в том, что при прокрутке внизу tableView в ячейке сначала отображаются изображения предыдущего канала, а затем отображаются правильные изображения. Вот почему я очищаю содержимое ScrollView моей ячейки, но проблема остается.
Вот Контроллер HomeView Код
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let feed = feeds[indexPath.row]
let item = feed.item
let user = feed.user
if let cell = tableView.dequeueReusableCell(withIdentifier: "PostCell", for: indexPath) as? PostCell {
cell.delegate = self
if let images: [UIImage] = HomeViewController.postImagesCache.object(forKey: feed.postID as NSString) as? [UIImage] {
if let profileImage = HomeViewController.profileImageCache.object(forKey: user.profileImageUrl as NSString) {
cell.configCell(feed: feed, item: item, user: user, images: images, profileImage: profileImage, indexPath: indexPath)
} else {
cell.configCell(feed: feed, item: item, user: user, images: images, indexPath: indexPath)
}
} else {
if let profileImage = HomeViewController.profileImageCache.object(forKey: user.profileImageUrl as NSString) {
cell.configCell(feed: feed, item: item, user: user, profileImage: profileImage, indexPath: indexPath)
} else {
cell.configCell(feed: feed, item: item, user: user, indexPath: indexPath)
}
}
return cell
} else {
return PostCell()
}
}
и PostCell код
override func prepareForReuse() {
super.prepareForReuse()
imageScrollView.subviews.forEach { $0.removeFromSuperview() }
profileImage.image = nil
}
override func draw(_ rect: CGRect) {
profileImage.layer.cornerRadius = profileImage.frame.size.width/2
profileImage.clipsToBounds = true
}
func configCell(feed: Feed, item: Item, user: User, images: [UIImage]? = nil, profileImage: UIImage? = nil, indexPath: IndexPath) {
self.feed = feed
self.item = item
self.user = user
self.postCaption.text = item.caption
if feed.like {
self.likeImage.image = UIImage(named: "like_filled")
} else {
self.likeImage.image = UIImage(named: "like_empty")
}
if feed.messageID != "" {
self.messageSentImage.image = UIImage(named: "message_filled")
} else {
self.messageSentImage.image = UIImage(named: "message_empty")
}
let rating = PostCell.roundRating(item.avgRating, toNearest: 0.5)
self.ratingsImage.image = UIImage(named: "\(rating) rating")
let ratingsString = NumberFormats.formatPoints(num: Double(item.ratingsCount))
if item.ratingsCount != 1 { // if rating is 0 or more than 1
self.ratingsLabel.text = "\(ratingsString) Ratings"
} else {
self.ratingsLabel.text = "\(ratingsString) Rating"
}
let likesString = NumberFormats.formatPoints(num: Double(item.likesCount))
self.likesLabel.text = likesString
self.profileName.text = user.fullname
// loading profileImage
if profileImage != nil {
self.profileImage.image = profileImage
self.user.profileImage = profileImage!
} else {
if user.profileImageUrl != "" {
let storageRef = Storage.storage().reference(forURL: user.profileImageUrl)
storageRef.getData(maxSize: 1 * 200 * 200, completion: { (data, error) in
if error != nil {
print("Image error: ", error!)
} else {
if let imgData = data {
if let img = UIImage(data: imgData) {
self.profileImage.image = img
self.user.profileImage = img
HomeViewController.profileImageCache.setObject(img as UIImage, forKey: user.profileImageUrl as NSString)
}
} else {
self.profileImage.image = UIImage(named: "profile_icon")
self.user.profileImage = UIImage(named: "profile_icon")!
}
}
})
} else {
self.profileImage.image = UIImage(named: "profile_icon")
self.user.profileImage = UIImage(named: "profile_icon")!
}
}
if images != nil {
imageScrollView.subviews.forEach { $0.removeFromSuperview() }
self.profileImage.image = nil
self.createImageSlides(images: images!)
self.item.images = images!
self.serviceIsLoading = false
HomeViewController.isFirstLoad = false
} else {
self.imageScrollView.subviews.forEach { $0.removeFromSuperview() }
self.profileImage.image = nil
DispatchQueue.global(qos: .userInitiated).async {
var postImages:[UIImage] = []
let urls = self.item.postImageUrls
let downloadGroup = DispatchGroup()
for i in 0 ..< urls.count {
downloadGroup.enter()
if urls[i] != "" {
let storageRef = Storage.storage().reference(forURL: urls[i])
storageRef.getData(maxSize: 1 * 1024 * 1024, completion: { (data, error) in
if error != nil {
print(error!)
downloadGroup.leave()
} else {
if let imgData = data {
if let img = UIImage(data: imgData) {
postImages.append(img)
downloadGroup.leave()
}
}
}
})
}
}
downloadGroup.wait()
DispatchQueue.main.async {
self.createImageSlides(images: postImages)
HomeViewController.postImagesCache.setObject(postImages as AnyObject, forKey: feed.postID as NSString)
self.item.images = postImages
self.delegate?.reloadRowHeight(indexPath: indexPath)
self.serviceIsLoading = false
HomeViewController.isFirstLoad = false
}
}
}
}
func createImageSlides(images: [UIImage]) {
for i in 0 ..< images.count {
let imageView = UIImageView(image: images[i])
imageView.contentMode = .scaleAspectFit
imageView.frame = CGRect(x: self.postMediaView.frame.width * CGFloat(i), y: 0, width: self.postMediaView.frame.width, height: self.postMediaView.frame.height)
imageView.roundCornersForAspectFit(radius: 10)
let itemTap = UITapGestureRecognizer(target: self, action: #selector(itemTapped))
itemTap.numberOfTapsRequired = 1
imageView.addGestureRecognizer(itemTap)
imageView.isUserInteractionEnabled = true
self.imageScrollView.addSubview(imageView)
}
imageScrollView.contentSize = CGSize(width: postMediaView.frame.width * CGFloat(images.count), height: postMediaView.frame.height)
imageScrollView.isPagingEnabled = true
imageScrollView.isHidden = false
pageControl.numberOfPages = images.count
pageControl.currentPage = 0
postMediaView.bringSubviewToFront(pageControl)
}