2017-03-07 36 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

相關問題