【teratail】Firebaseに保存されてるデータの受け取り方

自分でFirebaseと連携する機能を実装した際、思い通りに動作しなかったので、復習として書きます。

 

 

質問

 

teratail.com

 

実現したいこと

 

Firebaseに保存した全てのデータをタイムライン形式でセルに表示したい

 

困っていること

 

Firebaseに保存されてるはずなのに、セル(データ)が1つしか表示されない。

 

解決方法

 

原因は、データがまとめて格納されたposts配列をfor文内に書いてしまい、せっかく受け取ったデータを消してしまったことです。

 

なので、posts配列をfor文に入る前に初期化すればいいのです。

 

解決後のコード

 

ref.child("post").observeSingleEvent(of: .value) { (snap,error) in
     
    //Firebaseのデータが入ったsnapを配列に格納
    let snapData = snap.value as? [String:NSDictionary]
            
    if snapData == nil {
         return
    }
            
 //NSObjectクラスの”Post.swift”に表示したいデータを格納する変数を宣言してます
 //1つのセルに表示したいデータ群をposts配列に格納していきます
    self.posts = [Post]()
            
    for (_,post) in snapData! {

	 //解決前は、ここにposts配列の初期化をしてました
	 //self.posts = [Post]()
                
	 //取得したデータを毎回posstが受け取ります
	 //新品のデータを受け取るために毎回初期化します
            self.posst = Post()
                
            if let title = post["title"] as? String, let sentence = post["sentence"] as? String, let pictureURLString = post["pictureURLString"] as? String, let category = post["category"] as? String {
                    
                    self.posst.title = title
                    self.posst.sentence = sentence
                    self.posst.pictureURLString = pictureURLString
                    self.posst.category = category
                   
            }
                
            self.posts.append(self.posst)
                
            print(self.posts)
                
    }
            
    self.tableView.reloadData()
            
}

 

解決前は、

 

1つ目のデータを受け取る

初期化

2つ目のデータを受け取る

初期化

 

というプロセスで、最終的にposts配列には最後に入れたデータしか残りませんでした。

 

しかし、解決後は、

 

初期化

1つ目のデータを受け取る

2つ目のデータを受け取る

3つ目のデータを受け取る

 

というプロセスに変わり、全てのデータをきちんと格納できています。