无法将变量值从 firebase firestore 传递到另一个 class SWIFT

Can't pass variable value from firebase firestore to another class SWIFT

所以我在 class Functions 中有这个功能:

struct Prices {
      var standardPrice: Int!

}

// FUNC PRICING

class Functions {
    private var PricingRef: CollectionReference!
    var price = Prices()

func getPrice() -> Prices {

        PricingRef = Firestore.firestore().collection("ProductXYZ")

        PricingRef.getDocuments { (snapshot, error) in
            if let err = error {
                debugPrint("Error fetching data \(err)")
            }
            else {
                guard let snap = snapshot else { return }
                for document in snap.documents {
                    let data = document.data()
                    let std = data["standard"] as! String
                    self.price.standardPrice = Int(std)!
                    print(self.price.standardPrice!) // This print the intended result

                }

            }
        }
        return price
    }
}

然后我想将 standardPrice 值传递给这个 class,称为 PriceList :

class PriceList: UITableViewController {
     var price = Prices()
     var newStandardPrice = 0

func Price() {
        price = Functions().getPrice()
        newStandardPrice = price.standardPrice // always error with value nil
}

我总是遇到 newStandardPrice 为零的错误。 但是 print(self.price.standardPrice!) 显示了我想要的结果数。 据我所知,这里的问题是因为 firebase firestore 从数据库中获取数据需要时间。 从 firebase 数据库分配新价格后如何获取 standardPrice 的值?

任何帮助将不胜感激

谢谢

您需要使用完成处理程序,因为它的异步功能

func getPrice(completion:@escaping (Prices?,Error?)-> Void)  {

        PricingRef = Firestore.firestore().collection("ProductXYZ")

        PricingRef.getDocuments { (snapshot, error) in
            if let err = error {
                debugPrint("Error fetching data \(err)")
                 completion(nil,err)
            }
            else {
                guard let snap = snapshot else { return }
                for document in snap.documents {
                    let data = document.data()
                    let std = data["standard"] as! String
                    self.price.standardPrice = Int(std)!
                    print(self.price.standardPrice!) // This print the intended result
                    completion(self.price.standardPrice,nil)

                }

            }
        }

    }

如何使用

Functions().getPrice { (price, error) in

        if let err = error {
            // do something if you get error
        } else if let getPrice = price {
            // use price
           self.price = getPriice
        }