方法返回后接收Firebase数据

时间:2018-08-07 07:54:14

标签: swift firebase firebase-realtime-database

我正在尝试掌握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应该可以实现,但是似乎缺少了重要的一部分...

0 个答案:

没有答案