2017-03-07 5 views
1

現在、Firebaseデータベース内の「投稿」の数を取得しようとしていますが、なんらかの理由で1に等しい"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がFirebaseを1に置き換える前にpostNumberを呼び出していることです。Firebaseのクエリは非同期で動作します。基本的にFirebaseがクエリの結果をフェッチしている間、コードは実行され続けます。

これを表示する簡単な方法は、最初の行をこれに置き換えることです。 didSetは、postNumberの値が変更されるたびに実行されます。これは、コマンドが実行された順序を正確に示します。

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

そして、あなたはあなたのcollectionViewを埋めるためにpostCollectionを使用している場合は、

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

を使用することができますあなたはそのままで、これはあなたにどのような非同期の基本的な理解を与える必要があり、あなたのコードの残りの部分を残すことができますです。グーグルでは、非同期コードを扱うエレガントな方法を見つけることができるはずです。上記の回答については詳しく説明し

Async vs. synchronous

+1

これはうまくいきました、ありがとう!私は非同期コードを詳しく見ていきます。 – Skiddswarmik

0

、Firebaseは、それが完了した後、あなたは非同期呼び出しから取得したデータに作業を行うことができます完了ハンドラまたはコールバックを使用しています。あなたの例では、非同期操作のため、printコマンドは両方とも、Firebaseが非同期呼び出しから戻る前に実行されます。 Firebase補完ハンドラの外部で実行されたコードは、データが取得される前に実行されるリスクを伴います。

このFirebaseのドキュメントでは、非同期操作とコールバック(完了ハンドラ)について説明します。

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

+0

ありがとう、これは本当に役に立ちます! – Skiddswarmik

+0

@ Pieterの答えがあなたを助けてくれたなら、彼の答えをあなたの問題に対する正解とすることを検討してください。 – dstepan

関連する問題