将FirebaseDataSnapshot作为字符串添加到数组(快速3)

收藏

因此,我目前正在尝试在我的Firebase数据库中获取“Posts”的数量,但是由于某种原因,它说这个数量等于1(这是真的),但是在调用“postNumber”时会自动重置。我还想将数据保存在数组中,以便以后使用,所以我将其全部保存在数组中,而不是直接读取数据库,根本不存储任何数据。
viewDidLoad()函数

var postNumber = 0
override func viewDidLoad() {
        super.viewDidLoad()

        updateFeed()
        print("PostNumber in ViewDidLoad: \(self.postNumber)") //equals 0
        collectionView?.backgroundColor = .white
    }

updateFeed函数
func updateFeed(){
        let uid = FIRAuth.auth()?.currentUser?.uid
        let ref = FIRDatabase.database().reference(fromURL: "https://firebaseio.com/")

        ref.child("users").child(uid!).child("Posts").observe(.value, with: { (snapshot) in
            for item in snapshot.children{
                let snapshotValue = snapshot.value as? NSDictionary
                var snapString = String(describing: item)
                var snapInt = Int(snapString)
                self.postCollection.append(snapString)
                let firstName = (snapshot.value as! NSDictionary)["First Person"] as? String
                print("SnapShot: \(snapString)") //gives proper data
                self.postNumber = self.postCollection.count
                print("PostNumber: \(self.postNumber)") //equals 1
                print("PostSource: \(self.postCollection)")
            }
        })
        print("Number of Posts (After Adding): \(self.postCollection.count)") //equals 0
        collectionView?.reloadData()
    }


最佳答案:

它实际上不会自行重置。问题是,在Firebase有机会将postNumber替换为1之前,您正在调用postNumber。Firebase查询异步工作,这基本上意味着当Firebase获取查询结果时,代码将继续运行。
显示这一点的一个简单方法是用这个替换第一行。每次postNumber的值更改时,didSet都将运行。这将显示命令的执行顺序。

var postNumber = 0 {
  didSet {
    print(postNumber)
  }
}

如果使用后集合来填充collectionView,则可以使用
var postCollection = [String]() {
  didSet {
    collectionView?.reloadData()
  }
}

您可以保持代码的其余部分不变,这将使您基本了解什么是异步。通过一些google,您应该能够找到处理异步代码的优雅方法。
Async vs. synchronous