UITableView показывает неправильные изображения postCell Swift 4 - PullRequest
0 голосов
/ 28 июня 2019

Здравствуйте, я работаю, чтобы получить решение с 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)

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