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