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

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

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

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

Q&A

解決済

1回答

805閲覧

取得したデータの再利用

abc1222

総合スコア24

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

0グッド

0クリップ

投稿2020/11/04 06:56

編集2020/11/04 12:31

前提・実現したいこと

データベース等から取得したデータを複数の画面で利用したいと思っています。
調べていて、なんとなく下記のようにすればよいのかなとイメージはできたのですが、実際にどのように実装すればよいのかが分かりません。

  1. クラスを用意してそこに読み込んだデータを初期値として入れる
  2. 活用する画面のコントローラーで上記を呼び出す?

色々なやり方があるとは思うのですが、それ故、初心者には調べても具体的にどのようなコードを書けばよいのか分からず、なにかヒントを頂けたらと思い質問しました。

備考

データベースはFirestoreを予定していますが、活用する以前に読み込んだデータをどう扱えばよいのかが分からず止まっています。

Firestoreを利用する理由は、データに合わせてリアルタイムにビューを変更したく、初期値からデータが変更になる可能性があることも、どのようにコードを書けばよいのかわからない原因の一つです。

追記

考えるより手を動かしたほうが良いというアドバイスを頂いたので、なんとなくのイメージを自分なりに調べて、ツギハギ状態+エラーが出ている状態ですが、今の状態をたたき台?のつもりで追記しておきます。

Swift

1import Foundation 2import Firebase 3 4class AccountModel { 5 6 static let notificationName = "AccountModelChanged" 7 8 let notificationCenter = NotificationCenter() 9 // 今数値がいくらなのか保持する(データの保持) 10 internal var account: Account? { 11 didSet { 12 // Modelを監視しているコントローラーに変更を通知する 13 notificationCenter.post( 14 name: .init(rawValue: AccountModel.notificationName), 15 object: account 16 ) 17 } 18 } 19 20 init(){ 21 let user = Auth.auth().currentUser 22 let db = Firestore.firestore() 23 db.collection("user").document("(user!.uid)").addSnapshotListener { 24 documentSnapshot, error in 25 26 if let accountValue = documentSnapshot.flatMap({ 27 $0.data().flatMap({ (data) in 28 return Account(dictionary: data) 29 }) 30 }) { 31 self.account = accountValue 32 } else { 33 print("Document does not exist") 34 } 35 } 36 } 37} 38

Swift

1import Foundation 2 3public struct Account: Codable { 4 5 let name: String? 6 let gender: String? 7 let age: String? 8 9 enum CodingKeys: String, CodingKey { 10 case name 11 case gender 12 case age 13 } 14 15}

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

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

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

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

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

guest

回答1

0

ベストアンサー

データベースはFirestoreを予定していますが、活用する以前に読み込んだデータをどう扱えばよいのかが分からず止まっています。

悩まれる前に、とりあえずコードを書かれてみてはいかがでしょうか。
現状では、目的とするアプリを作るために Firestore を使っているのではなく、Firestore を使うためにアプリを考えているように感じられます。

Firestore からデータをダウンロード、ないしアップロードする部分を毎回記述して、とりあえずアプリを完成させたあと、共通化する方法(リファクタリングなど)を考えてもいいと思います。

  1. クラスを用意してそこに読み込んだデータを初期値として入れる
  2. 活用する画面のコントローラーで上記を呼び出す?

上記の方法であれば、一つは Firestore へのアクセスを行うシングルトンのクラスを作る方法があるかもしれませんが、推奨されないと思います。

その理由の一つは、シングルトンクラスを真面目に実装しようとなると、排他処理を厳密に行う必要があるためです。

たとえば、下記のような議論を見つけましたが、同じような理由で Firestore のシングルトン化は推奨していません。明示的には書かれていませんが、必要に応じて毎回アクセスするのが一番よいというニュアンスです。

ただ、データ管理方法の一つとしてシングルトンパターンがあるというのは覚えておいて損はないと思います(わかりやすい例だと、UserDefaults がシングルトンパターンを使った実装例です)。

投稿2020/11/04 09:29

TsukubaDepot

総合スコア5086

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

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

abc1222

2020/11/04 12:19

回答ありがとうございます! 説明不足で申し訳ありません。毎回の取得自体は実際にやってみて出来ました! ただ、本当に基本的な書き込みや読み込みしか使わなかったので、もっと大きなアプリだと、データを使いまわしたり、カスタムオブジェクトを利用してみたりが出来ないと駄目なのかなと思い、ご指摘の通り「Firestore を使うためにアプリを考えている=勉強中」の状態です。 そして、まったく手がかりが掴めず、勉強の手すら止まっているという感じです、、、
abc1222

2020/11/04 12:20

「シングルトン」ありがとうございます。 ちょっと元々の質問や頂いた回答とはズレるかもしれないのですが。 Firestoreの場合、ドキュメントデータの一部が変更されても、リアルタイムリスナーではドキュメントのデータが丸々取得されると思います。 シングルトンで単一のインスタンスとして管理するメリットはどのようなものになるのでしょうか。
(すみません、インスタンスがちゃんと理解できていないのでトンチンカンな質問なのかもしれませんが、、、)
abc1222

2020/11/04 12:33

上記の質問に至った経緯?自分なりに調べてコード化してみている最中のものを追記しています
TsukubaDepot

2020/11/04 13:00

シングルトンのメリットは、データ管理のインスタンスを一元化できるという点かと思います。 ただ、リアルタイムリスナーという機能を考えると、シングルトンパターンを使うよりも、追記されたコードのように NotificationCenter をつかったパターンのほうが良いかと思います。 一方、ちょっと調べていたらこのような記事も見つけました。 https://qiita.com/tyannaka/items/8b5d1326903dc49c3a68 私自身が Firestore については不勉強なので、これが適切な例か判断できないのですが、データの変更に合わせてトリガーをかけるような例があったので、そちらを使うというのはいかがでしょうか。 公式だとこのあたりになるのでしょうか。 https://firebase.google.com/docs/database/ios/lists-of-data?hl=ja#listen_for_child_events
abc1222

2020/11/05 02:43

ありがとうございます! NotificationCenterを使ったパターンで、参考サイトも活用しながら手を進めてみたいとおもいます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問