Обновление UICollectionView: получение каждой ячейки более одного раза - PullRequest
1 голос
/ 27 апреля 2020

Привет У меня возникла проблема, что после обновления моего collectionView я получаю каждую ячейку дважды в моем представлении. И после повторного обновления я получаю каждую клетку 3 раза. Я также получаю эту проблему при представлении представления с segue во второй раз.

Как я могу это исправить?

Может кто-нибудь мне помочь?

Заранее спасибо !!!


import UIKit
import Firebase


class FeedViewController: UIViewController, UICollectionViewDelegate, UICollectionViewDataSource, UICollectionViewDelegateFlowLayout {

 private let refreshControl = UIRefreshControl()
@IBOutlet weak var collectionview: UICollectionView!

    var posts = [Post]()


    override func viewDidLoad() {
    super.viewDidLoad()

        collectionview.refreshControl = refreshControl
        refreshControl.addTarget(self, action: #selector(refreshWeatherData(_:)), for: .valueChanged)
        refreshControl.tintColor = UIColor(hex: "#F17D32")


    }


 @objc private func refreshData(_ sender: Any) {

        fetchData()
        posts.removeAll()
        collectionview.reloadData()

    }

    private func fetchData() {

       getPost()
    self.refreshControl.endRefreshing()


    }


func getPosts(){

            let ref = Database.database().reference()

                            ref.child("posts").queryOrderedByKey().observeSingleEvent(of: .value, with: { (snap) in


                                let postsSnap = snap.value as! [String : AnyObject]

                                for (_,post) in postsSnap {


                                                let posst = Post()
                                                if let author = post["author"] as? String, late date = post["date"], let postID = post["postID"] as? String, let userID = post["userID"] as? String  {
                                                    posst.date = date
                                                    posst.author = author
                                                    posst.postID = postID
                                                    posst.userID = userID

                                                     self.posts.sort(by: {$0.postdateprog > $1.postdateprog})
                                                    self.posts.append(posst)
                                                }



                                        self.collectionview.reloadData()
                                    }

                            })



        }

func numberOfSections(in collectionView: UICollectionView) -> Int {
        return 1
    }

    func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {

        print(posts.count)
        return self.posts.count
    }

    func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {



        let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "postCell", for: indexPath) as! PostCell

        cell.authorlabel.text = self.posts[indexPath.row].author
        return cell
    }

    func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize
    {
        return CGSize(width: self.collectionview.frame.width / 2 - 20, height: self.collectionview.frame.width * 0.7)

    }

}

1 Ответ

0 голосов
/ 28 апреля 2020

Функции Firebase являются асинхронными, и код в замыкании будет вызываться после выполнения синхронного кода. Другими словами, у вас есть это

   fetchData()
   posts.removeAll()
   collectionview.reloadData()

, но posts.removeAll() и collectionview.reloadData() будут называться до того, как заполнится массивом.

Итак, вот сокращенный обзор порядка, в котором следует вызывать вещи.

@objc private func refreshData(_ sender: Any) {
   self.loadFirebaseData()
}

func loadFirebaseData() {
   ...
   self.posts = []
   for (_,post) in postsSnap {
      self.posts.append(posst)
   }
   self.posts.sort(by: {$0.postdateprog > $1.postdateprog}
   self.collectionview.reloadData()
}

Обратите внимание, что я переместил сортировку и reloadData за пределы для l oop. Нет смысла вызывать эти функции снова и снова, так как источник данных заполняется. Сделайте это после того, как эта задача будет выполнена.

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