【问题标题】:How to populate an object array using a Firebase Database如何使用 Firebase 数据库填充对象数组
【发布时间】:2019-07-27 10:20:46
【问题描述】:

我无法创建从 Firebase 数据库返回 Product 对象数组的函数。

我尝试在闭包中使用开关将变量设置为各自的名称,然后在设置所有变量后实例化对象。我尝试使用闭包的范围来尝试访问“检索值”。下面是我的 Firebase 数据库、产品对象和函数的快照。


 func createArray() -> [Product] { 

        var newArray = [Product]()
        let ref = Database.database().reference()
        var productName = String()
        var productHealth = String()
        var productPrice = 0
        var productImage = String()

        for bigIndex in 0..<7 {
            for smallIndex in 0..<4{
                ref.child("masterSheet/\(bigIndex)/\(smallIndex)").observeSingleEvent(of: .value) { (snapshot) in let retrievedValue = snapshot.value}
                //I used to have a switch statement here that went like
                //switch smallIndex{ case 0: productPrice = retrievedValue as! String }

            }
            let completeProduct = Product(productName: productName, productHealth: productHealth, productPrice: productPrice, productImage: productImage)
            newArray.append(completeProduct)
        }
        return newArray
    }

产品对象:

import Foundation
import UIKit

class Product {
    var productName: String
    var productHealth: String
    var productPrice: Int
    var productImage: String

    init(productName: String, productHealth: String, productPrice: Int, productImage: String ){
        self.productName = productName
        self.productHealth = productHealth
        self.productPrice = productPrice
        self.productImage = productImage

    }
}

我的目标是生成数据库中所有项目的数组。

【问题讨论】:

  • Firebase Snapshot。此外,这甚至是获取数据的最佳方式吗?
  • 不相关,但我们鼓励您删除多余的属性命名。根据指南,名称应为namehealth 等。
  • Firebase 是异步的,因此 return newArray 将在 Firebase 闭包中的代码运行之前执行。请参阅闭包 Firebase is Asynchronous 中有关使用 Firebase 数据的大量文章。此外,通常最好不要像同步函数那样调用 Firebase 并返回一个值。应用程序的速度由您的 Firebase 闭包设置,因此请利用它 - 例如从 Firebase 请求数据,填充一个数组,然后在闭包中填充 tableView.reloadData。
  • 感谢cmets,我已经阅读并发现了如何做到这一点:)!

标签: ios swift firebase firebase-realtime-database


【解决方案1】:

您需要从 smallIndex 中获取值并将其设置为 modelClass Product,如下所示:

     func createArray() -> [Product] { 

            var newArray = [Product]()
            let ref = Database.database().reference()

            for bigIndex in 0..<7 {
                for smallIndex in 0..<4{
                    ref.child("masterSheet/\(bigIndex)/\(smallIndex)").observeSingleEvent(of: .value) { (snapshot) in let retrievedValue = snapshot.value}
                    //I used to have a switch statement here that went like
                    //switch smallIndex{ case 0: productPrice = retrievedValue as! String 

          let singleProduct = Product()
          singleProduct.productName = "fetch value from small index"
          singleProduct.productPrice = retrievedValue  
          sigleProduct.productHealth = "fetch value from small index"


                newArray.append(singleProduct)

}

                }

            }
            return newArray
        }

【讨论】:

  • 这是不正确的。 return newArray 代码将在从 Firebase 填充数组之前执行 LONG,并且始终返回 nil。 Firebase 快照仅在闭包内有效
【解决方案2】:

对于任何想知道的人来说,这是最终为我工作的解决方案:)

var product: [Product] = []

ref = Database.database().reference()
databaseHandle = ref.child("masterSheet").observe(.value) { (snapshot) in
            guard let rawData = snapshot.value as? [AnyObject] else { return } 

            for item in rawData {
                guard let itemArray = item as? [AnyObject] else { continue }

                var pro = Product()
                if itemArray.count > 0 {
                    pro.productName = itemArray[0] as? String
                }

                if itemArray.count > 1 {
                    pro.productHealth = itemArray[1] as? String
                }

                if itemArray.count > 2 {
                    pro.productPrice = itemArray[2] as? Int
                }

                if itemArray.count > 3 {
                    pro.productImage = itemArray[3] as? String
                }

                // if you use dict, do like this:
                //pro.productImage = itemArray["productImage"] as? String
                //pro.productPrice = itemArray["productPrice"] as? Int

                product.append(pro)
            }

            self.tableView.reloadData()
        }


【讨论】:

    猜你喜欢
    • 2018-08-19
    • 2021-01-13
    • 2018-09-25
    • 1970-01-01
    • 2023-03-27
    • 1970-01-01
    • 1970-01-01
    • 2020-09-06
    • 2018-07-21
    相关资源
    最近更新 更多