在从数据库获取数据之前初始化 CollectionView - iOS

CollectionView is initialized before getting data from Database - iOS

我有一个 posts 数组,其中填充了我的数据库中的数据 (数据填充发生在 viewDidLoad 中的一个函数中) 。稍后,将使用该数据配置 collectionViewCell

由于数据从数据库中获取有点延迟,下面的函数没有return任何Int值。

 func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
    return posts.count
}

我已经通过下面的代码在 viewDidLoad 中进行了测试

 override func viewDidLoad() {
    super.viewDidLoad()

    print(posts.count) //TESTED BY PRINTING POSTS.COUNT WHICH IS 0 CURRENTLY
    getVideosNamesAndUsers() // The function which gets data from database and updates posts Array
    view.addSubview(collectionView)
}

所以我的单元格应该配置来自 posts 数组 的数据,但是因为 posts 数组在数据到来之前被初始化从数据库。从数据库下载数据后,它会根据该数据更新 post 数组。

使用以下代码配置和重新加载单元格,但没有任何反应。我的细胞没有显示。

func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
        let postModel = posts[indexPath.row]
        
        guard let cell = collectionView.dequeueReusableCell(withReuseIdentifier: MusicGenresPostsCollectionViewCell().identifier, for: indexPath) as? MusicGenresPostsCollectionViewCell else {
            return UICollectionViewCell()
        }
            
            self.collectionView = collectionView
            cell.configure(with: postModel)
            collectionView.reloadData()

        return cell
    } 

注意:我已经注册了单元格并添加了 delegate = self 和 datasource = self。我的 collectionView 单元格仍然没有显示。任何想法将不胜感激。

  1. 你不应该在 collectionView(cellForItemAt:) 中调用 collectionView.reloadData()。这样做的原因是 collectionView(cellForItemAt:) 是每个单元格的 运行 一次。所以如果你有 50 个单元格,它就会被调用 50 次。在这 50 次中的每一次中,您都在告诉它重新加载。因此,当您在 .reloadData()

    触发的函数中调用 .reloadData() 时,您的 UICollectionView 将无限重新加载
  2. 在检索数据之前初始化您的 UICollectionView 没有问题。问题是您没有在收到数据时更新 UICollectionView,只有存储数据的变量。

您没有显示 getVideosNamesAndUsers() 的样子,但是当数据下载完成后您的代码将去哪里,您应该实现 collectionView.reloadData().