2017-03-07 35 views
1

所以我目前正在尝试获取我的Firebase数据库中“帖子”的数量,但由于某种原因,它说的金额等于一(这是真的),但然后在调用“postNumber”时重置自身。我也想将数据保存在数组中以备后用,所以我把它全部保存在一个数组中,而不是直接从数据库中读取数据,也不存储任何数据。将FirebaseDataSnapshot添加到数组作为字符串(Swift 3)

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() 
    } 
+0

难道你不能存储快照本身吗?快照是不可变的,所以丢失数据应该没有问题。为什么你需要把它变成一个字符串? –

+0

你可以,但它不改变函数后调用数组长度 – Skiddswarmik

回答

1

实际上它并不重置。问题是您在Firebase有机会将其替换为1之前调用postNumber。Firebase查询异步工作,基本上这意味着您的代码将在Firebase获取查询结果时继续运行。

一个简单的方法来显示这将是用这个替换你的第一行。每当postNumber的值发生变化时,didSet都会运行。这将显示命令的执行顺序。

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

如果你正在使用postCollection填补你的CollectionView可以使用

var postCollection = [String]() { 
    didSet { 
    collectionView?.reloadData() 
    } 
} 

你可以留下你的代码的其余部分是,这应该给你什么异步的基本认识是。随着一些谷歌搜索,你应该能够找到优雅的方式来处理异步代码。

Async vs. synchronous

+1

这工作,谢谢!我将更多地关注异步代码。 – Skiddswarmik

0

为了详细说明上面的回答,火力地堡采用了完成处理程序或回调这使得一旦已经完成你做从异步调用检索到的数据的工作。在您的示例中,由于异步操作,您的两个print命令都是在Firebase从异步调用返回之前执行的。在Firebase完成处理程序之外执行的任何代码都会在检索数据之前执行执行的风险。

我会回顾一下这个Firebase文档,其中讨论了它们的异步操作和回调(完成处理程序)。

https://firebase.google.com/docs/database/ios/read-and-write

+0

谢谢,这真的很有帮助! – Skiddswarmik

+0

太棒了。如果@ Pieter的回答对您有帮助,请考虑将他的回答标记为您问题的正确答案。 – dstepan

相关问题