我正在尝试掌握Firebase数据库。 这是数据库的示例:
{
"products" : {
"productname" : {
"description" : "this products description"
}
}
}
现在,我正在尝试实现一个单独的服务类来与数据库通信:
import Foundation
import FirebaseDatabase
class FirebaseFactory {
static let ref = Database.database().reference()
static func getProduct(by name: String) -> String? {
dispatchGroup.enter()
var productToReturn: Product?
DispatchQueue.global().async {
ref.child("products").child(name).observeSingleEvent(of: .value) { (snapshot) in
if snapshot.exists() {
let identifier = snapshot.key
if let name = snapshot.childSnapshot(forPath: "name").value as? String {
productToReturn = Product(identifier: identifier, name: name)
print("\n1. Within closure: ", productToReturn, "\n")
}
dispatchGroup.leave()
}
}
}
return productToReturn
}
现在的问题是,当我调用它时(出于测试目的,我通常从我的第一个ViewControllers viewDidLoad()方法中尝试这样做,在从Firebase数据库获取完成之前,getProduct(by :)返回。
let product = FirebaseFactory.getProduct(by: "productname")
print("\n2. Returned: ", product, "\n")
产生以下打印结果。
2. Returned: nil
1. Within closure: Optional(this products description)
现在我知道我可以在自定义方法中实现完成处理程序-但这不是我想要的。我想从视图控制器中抽象提取逻辑。
我知道GCD应该可以实现,但是似乎缺少了重要的一部分...