質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Firebase

Firebaseは、Googleが提供するBasSサービスの一つ。リアルタイム通知可能、並びにアクセス制御ができるオブジェクトデータベース機能を備えます。さらに認証機能、アプリケーションのログ解析機能などの利用も可能です。

Q&A

解決済

1回答

495閲覧

[SwiftUI] Firebase databaseで、辞書を扱うことができない

yoshi88

総合スコア12

Firebase

Firebaseは、Googleが提供するBasSサービスの一つ。リアルタイム通知可能、並びにアクセス制御ができるオブジェクトデータベース機能を備えます。さらに認証機能、アプリケーションのログ解析機能などの利用も可能です。

0グッド

0クリップ

投稿2022/07/26 06:54

編集2022/07/26 07:53

前提

firebase databaseに以下のようなデータを入力して、それをiOSアプリ上で使いたいと考えております。イメージ説明

実現したいこと

辞書の中にはString型やInt型、bool型が混在していますが、これらのデータをiOSアプリに呼び込んで使えるようにしたいです

該当のソースコード

SwiftUI

1import SwiftUI 2import FirebaseCore 3import Firebase 4 5struct TestView: View 6{ 7 @State var data = [String: Any]() 8 func getData(){ 9 let ref = Database.database().reference() 10 ref.child("data").getData { (error, snapshot) in 11 if let error = error { 12 print("Error getting data \(error)") 13 } 14 else if ((snapshot?.exists()) != nil) { 15 guard let data = snapshot?.value as? [String: Any] else { 16 return 17 } 18 self.data = data 19 } 20 else { 21 print("No data available") 22 } 23 } 24 print(self.data) 25 } 26 var body: some View { 27 Text("Hello, World!") 28 .onAppear(){ 29 getData() 30 } 31 } 32}

以上のコードより、辞書を呼び込んで、スマホの画面上に"Hello, World!"が表示されたタイミングで辞書がprintされることを意図したコードを書きました。しかし結果は、以下の画像の通り、辞書は空になってしまっている状態です、、
イメージ説明

どなたかご教授よろしくお願いいたします🙇

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

hoshi-takanori

2022/07/26 07:44

その data は、配列じゃなくて辞書 (Dictionary 型) になると思いますが…。
yoshi88

2022/07/26 07:55

確かにそうでした、、 今辞書に変更して試してみたのですが、結果はかわらず空のままでした。。何がいけないかお分かりになったりしますでしょうか、、?
guest

回答1

0

ベストアンサー

print(self.data) の内容が空で表示されてしまう原因は、
そのprintを実行している箇所がデータを受信する前に動作する箇所になっているからです。

getData メソッドは、データを受信したらクロージャを呼び出して受信データを
伝える仕様になっていますので、クロージャの処理の中で

self.data = data

を実施した直後(受信データをself.dataに格納した直後)に

print(self.data)

を実施すれば、受信データの内容が表示されると思います。

そして、 "Hello, World!" ではなく、 self.data の内容を Text で表示すれば、
self.data の変更を検知して画面が再描画されますので、受信したデータの内容が
画面に表示されると思います。

投稿2022/07/26 08:28

TakeOne

総合スコア6299

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yoshi88

2022/07/26 08:49

ご回答ありがとうございます!教えていただいた方法を用いてpirntすることができました! もう一つ質問させていただきたいのですが、辞書の内容を表示させるために、「ForEach」を使って表示させようと思ったのですがうまくいかず、、画面表示の方法も具体的に教えていただくことは可能でしょうか? お手隙の際にご確認よろしくお願いします🙇
TakeOne

2022/07/26 10:10

配列でないものをなぜForEachで表示しようとしているのかよくわかりません。ForEachで表示すべきものなのかよく考えてください。解決しないなら、どのようなデータをどのように表示したいのか、きちんと別質問を立てて説明した方が良いと思います。
yoshi88

2022/07/26 10:55

ご回答ありがとうございます! そうさせて頂きます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問