【问题标题】:Objects viewing - UICollectionView对象查看 - UICollectionView
【发布时间】:2018-02-08 16:49:33
【问题描述】:

我正在尝试将对象添加到数组中,以便使用 UICollection 视图查看它们。我正在使用 Firebase 使用此代码:

// Retrieve the products and listen for changes
    databaseHandle = ref?.child("Products").observe(.childAdded, with:
    { (snapshot) in

        // Code to execute when new product is added
        let prodValue = snapshot.value as? NSDictionary
        let prodName = prodValue?["Name"] as? String ?? ""
        let prodPrice = prodValue?["Price"] as? Double ?? -1
        let prodDesc = prodValue?["Description"] as? String ?? ""

        var prodToAddToView = Product(name: prodName, price: prodPrice, currency: "USD", description: prodDesc, location: "USA")
        self.products.append(prodToAddToView)
    })

但是当循环完成时,不会显示任何对象。另一方面,使用此代码:

var pr = Product(name: "a", price: 3, currency: "3", description: "SDF", location: "ASD")
    products.append(pr)

对象显示在 UICollectionView 中。如果我以与第二种方法相同的方式添加更多产品,它们也会显示出来。我错过了什么?在范围内添加对象不会影响外部数组吗?

另外 - 在调试时,我看到那里的观察函数中的 prodToAddToView 创建得很好。

产品的类型是 [产品]

编辑:

此代码在我的“ViewDidLoad”函数中,因为我想在视图加载之前加载所有产品。

【问题讨论】:

  • 您的调用是异步的,您需要在append() 之后执行yourCollectionView.reloadData(),并在主线程中执行(因为它与UI 相关,我不确定observe()闭包在主线程中。
  • 这没有成功。这段代码是在 ViewDidLoad 方法中编写的,因为我想在视图加载之前将项目加载到集合视图中。在继续之前,我需要一些方法来确保异步调用完成。我该怎么做?

标签: ios swift firebase uicollectionview


【解决方案1】:

您需要在self.products.append(prodToAddToView)下方的主线程中更新您的collectionView addself.collectionView.reloadData()

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

完整代码

databaseHandle = ref?.child("Products").observe(.childAdded, with:
{ (snapshot) in

    // Code to execute when new product is added
    let prodValue = snapshot.value as? NSDictionary
    let prodName = prodValue?["Name"] as? String ?? ""
    let prodPrice = prodValue?["Price"] as? Double ?? -1
    let prodDesc = prodValue?["Description"] as? String ?? ""

    var prodToAddToView = Product(name: prodName, price: prodPrice, currency: "USD", description: prodDesc, location: "USA")
    self.products.append(prodToAddToView)
    DispatchQueue.main.async {
        self.collectionView.reloadData()
    }
})

【讨论】:

  • 只是好奇为什么要在 DispatchQueue 中添加它?
  • 因为我不确定回调是否已经在主线程中@Cesare
  • 你,我的朋友,拯救了这一天!
  • 我很高兴帮助你@MathEnthusiast
  • 顺便说一句,这段代码运行起来很慢。可能是因为我在虚拟机上,但是 - 有什么建议可以让它更快地工作吗?
猜你喜欢
  • 2014-07-12
  • 1970-01-01
  • 1970-01-01
  • 2010-12-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-01-18
  • 2014-09-03
相关资源
最近更新 更多