【teratail】Firebaseに保存されてるデータの受け取り方
自分でFirebaseと連携する機能を実装した際、思い通りに動作しなかったので、復習として書きます。
質問
実現したいこと
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つ目のデータを受け取る
というプロセスに変わり、全てのデータをきちんと格納できています。