gpt4 book ai didi

swift - Swift 中的 Firebase 实时数据库

转载 作者:搜寻专家 更新时间:2023-11-01 06:27:51 26 4
gpt4 key购买 nike

经过几个小时试图弄清楚发生了什么而没有找到答案来填补我的空白之后,我终于决定在这里提问。虽然我假设我确实有并发问题,但我不知道如何解决它......

我有一个应用程序试图从 Firebase 实时数据库中提取包含以下内容的数据:

{
"products" : {
"accessory" : {
"foo1" : {
"ean" : 8793462789134,
"name" : "Foo 1"
},
"foo2" : {
"ean" : 8793462789135,
"name" : "Foo 2"
}
},
"cpu" : {
"foo3" : {
"ean" : 8793462789115,
"name" : "Foo 3"
}
},
"ios" : {
"foo4" : {
"ean" : 8793462789120,
"name" : "Foo 4"
},
"foo5" : {
"ean" : 8793462789123,
"name" : "Foo 5"
}
}
}
}

我在 Product.swift 中有一个数据模型:

class Product {
var identifier: String
var category: String
var ean: Int
var name: String

init(identifier: String, category: String, ean: Int, name: String) {
self.init(identifier: identifier)
self.category = category
self.ean = ean
self.name = name
}
}

我想在另一个名为 FirebaseFactory.swift 的类中获取数据。我打算用来与 Firebase 通信:

import Foundation
import FirebaseDatabase

class FirebaseFactory {

var ref = Database.database().reference()

func getAvailableProducts() -> [Product] {
var products = [Product]()
var data: DataSnapshot = DataSnapshot()

self.ref.child("products").queryOrderedByKey().observeSingleEvent(of: .value) { (snapshot) in
data = snapshot
// 1st print statement
print("From within closure: \(data)")
}
// 2nd print statement
print("From outside the closure: \(data)")
// Getting the products yet to be implemented...
return products

}
}

现在,我只是尝试从我的一个 View Controller 调用 getAvailableProducts() -> [Product] 函数:

override func viewWillAppear(_ animated: Bool) {
let products = FirebaseFactory().getAvailableProducts()
}

我现在的问题是第二次打印先于第一次打印——这也意味着从快照中检索数据并将其分配给data变量不会发生。 (我知道创建我的产品对象的代码丢失了,但这部分实际上不是我的问题——并发是……)

任何提示——在我拔掉更多头发之前——非常感谢!!

最佳答案

您的理论是正确的:您所描述的行为是异步数据如何与闭包一起工作。您已经体验过这如何导致返回所需数据的问题。这是一个很常见的问题。其实我写了一个blog最近,我建议你检查一下,这样你就可以应用解决方案:将闭包合并到你的函数中。以下是您展示的特定案例中的情况:

func getAvailableProducts(completion: @escaping ([Product])-> Void)  {
var products = [Product]()
var data: DataSnapshot = DataSnapshot()

self.ref.child("products").queryOrderedByKey().observeSingleEvent(of: .value) { (snapshot) in
data = snapshot
// do whatever you were planning on doing to return your data into products... probably something like
/*
for snap in snapshot.children.allObjects as? [DataSnapshot] {
let product = makeProduct(snap)
products.append(product)
}
*/
completion(products)
}
}

然后在viewWillAppear中:

override func viewWillAppear(_ animated: Bool) {
FirebaseFactory().getAvailableProducts(){ productsArray in
// do something with your products
self.products = productsArray
// maybe reload data if you have a tableview
self.tableView.reloadData()
}
}

关于swift - Swift 中的 Firebase 实时数据库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51546608/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com