检索数据后不重新加载集合视图

问题描述 投票:1回答:3

情况:我从Firebase中提取数据。拉动数据后,我想更新/重新加载我的collectionView表。

问题:collectionView不会更新。以下是一些解释的代码。

var allProducts = [Product]()

override func viewDidLoad() {
    super.viewDidLoad()

    mostPopularCollectionView.dataSource = self
    mostPopularCollectionView.delegate = self

    getAllProducts { (returnedProductArray) in
        self.allProducts = returnedProductArray
        self.mostPopularCollectionView.reloadData()
    }

}
  1. 函数getAllProducts工作正常。如果我在闭包中打印allProducts.count,我得到正确的数字(3)。
  2. 如果我在闭包之外打印allProducts.count,我的计数为零。
  3. 我尝试将getAllProducts函数放在viewWillAppear中,但它没有解决问题 extension FeedTableViewController:UICollectionViewDataSource,UICollectionViewDelegate { func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int { return 3 } func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell { guard let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "mostPopularCell", for: indexPath) as? MostPopularCollectionViewCell else {return UICollectionViewCell()} if allProducts.count > 0 { let product : Product = allProducts[indexPath.row] if let productImageUrl = product.imageUrlArray.first { cell.upadateCellUI(forProductName: product.title, forProductImage: productImageUrl, forProductPrice: product.price) } return cell } else { return cell } } func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) { let productVC = UIStoryboard.init(name: "Main", bundle: nil).instantiateViewController(withIdentifier: "productVC") as! ProductViewController productVC.product = allProducts[indexPath.row] present(productVC, animated: true, completion: nil) } }

好消息是,当我点击任何项目时,在下一个viewController出现时选择正确的产品。

所以唯一的问题是如何在从Firebase检索数据后重新加载collectionView?很感谢任何形式的帮助

这是用于从Firebase检索所有数据的getAllProducts函数。

//MARK:- Retrieve all products from Firebase
func getAllProducts (handler: @escaping (_ allProducts: [Product]) -> ()) {

    //TODO:- Create an empty array to store all product fetched from Firebase
    var productArray = [Product]()
    var imageUrlArray = [String]()

    //TODO:- Create reference to Firebase database
    let DB = Database.database().reference()

    //TODO:- Create reference to products
    let REF_PRODUCTS = DB.child("Product")

    //TODO:- Snapshot of all products in database
    REF_PRODUCTS.observeSingleEvent(of: .value) { (allProductsSnapshot) in
        guard let allProductsSnapshot = allProductsSnapshot.children.allObjects as? [DataSnapshot] else {return}

        for product in allProductsSnapshot {
            let title = product.childSnapshot(forPath: "name").value as! String
            let price = product.childSnapshot(forPath: "price").value as! String
            let id = product.childSnapshot(forPath: "id").value as! Int
            let viewCount = product.childSnapshot(forPath: "viewCount").value as! Int
            let description = product.childSnapshot(forPath: "description").value as! String

            let REF_IMAGEURL = REF_PRODUCTS.child(String(id)).child("image")

            REF_IMAGEURL.observeSingleEvent(of: .value, with: { (allImageUrlSnapshot) in
                guard let allImageUrlSnapshot = allImageUrlSnapshot.children.allObjects as? [DataSnapshot] else {return}

                for imageUrl in allImageUrlSnapshot {
                    let imageUrl = imageUrl.value as! String
                    imageUrlArray.append(imageUrl)
                }
            })

            let product = Product(title: title, price: price, imageUrlArray: imageUrlArray, description: description, viewCount: viewCount, id: id)
            productArray.append(product)
        }
        handler(productArray)
    }
}
ios firebase-realtime-database uicollectionview swift4.2
3个回答
0
投票

您应该始终更新主线程上的UI元素。这里也不例外。只需在主线程上执行重载代码即可。

dispatch_async(dispatch_get_main_queue(), {
   self.mostPopularCollectionView.reloadData()
})

对于Swift 3:

DispatchQueue.main.async { 
   self.mostPopularCollectionView.reloadData()
}

1
投票

你的viewDidLoad如下所示:

    var allProducts = [Product]()

override func viewDidLoad() {
   super.viewDidLoad()

    mostPopularCollectionView.dataSource = self
    mostPopularCollectionView.delegate = self

    getAllProducts { (returnedProductArray) in
        self.allProducts = returnedProductArray

     }
   self.mostPopularCollectionView.reloadData()
}

0
投票

这可能是由于自动布局问题,我陷入了相同的情况并解决了单元的自动布局问题,启用了调试日志以便在xcode上查看。并查看是否存在任何自动布局问题,请记住内容的大小应小于集合视图的内容

© www.soinside.com 2019 - 2024. All rights reserved.