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

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

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

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

Xcode

Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

Swift

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

Q&A

解決済

1回答

2751閲覧

FirebaseStorageのダウンロード方法

sam3457

総合スコア52

Firebase

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

Xcode

Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

Swift

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

0グッド

0クリップ

投稿2018/03/28 10:41

編集2018/03/28 11:04

SNSアプリ(twitter,insta系)を作っています。

Authを使ったログイン機能・ RealtimeDatabaseを使った投稿機能・プロフィールの保存機能が実装されています。

RDBの構造はこの様な形です
イメージ説明

ご覧の様に画像データ(投稿画像・アイコン画像)は圧縮、エンコードして文字列として保存していました。

しかし、RDBに画像の様な大容量のデータを保存するのはRDBの容量を圧迫するため、代わりにFirebaseStorageを使うと良いとのアドバイスをいただきました。

そこでまずプロフィールの名前はRDB、アイコン画像はStorageにアップロードするコードを書いてみました。
イメージ説明

swift

1 //userdefaultとサーバに送る 2 @IBAction func changeProfile(_ sender: Any) { 3 4 5 6 //userdefaultに保存 7 8 //名前 9 let username = nameTextField.text 10 userDefault.set(username, forKey: "username") 11 12 //アイコン画像 13 var data: Data = Data() 14 if let image = iconImageView.image { 15 data = UIImageJPEGRepresentation(image, 0.1)! as Data 16 } 17 let encodedIcon = data.base64EncodedString(options: Data.Base64EncodingOptions.lineLength64Characters) as String 18 userDefault.set(encodedIcon, forKey: "usericon") 19 20 21 //サーバにアップロード 22 let uid = Auth.auth().currentUser?.uid 23 24 //名前はRDBに保存 25 let RDBref = Database.database().reference() 26 let prof: Dictionary = ["username": username] 27 RDBref.child("profs").child(uid!).setValue(prof) 28 29 //アイコンは(初期画像でなければ)Storageに保存 30 if iconImageView.image != UIImage(named: "user.png") { 31 let storageRef = Storage.storage().reference() 32 storageRef.child("usericons").child(uid!).putData(data, metadata: nil) 33 } 34 KRProgressHUD.showSuccess(withMessage: "変更しました") 35 36 }

RDBと同じ様にusericonsというchildを作り、その中にchild(uid)で保存しました。

アップロードはできたのですがStorageに保存したものをダウンロードする際の方法が公式ページを見たところどうやら三つあるらしく、現在どの方法を使えば良いのか悩んでおります。
イメージ説明

ちなみにRDB・storageにアップロードしたプロフィール情報(名前とアイコン画像)はこの先タイムラインに投稿画像一枚と一緒にcollectionviewの一つのcellとして表示する予定です。
イメージ説明

この様な実装を考えたとき、

① 皆様はどの様な方法で画像をダウンロードしていますでしょうか?

② また、アップロードの仕方(RDBとStorageの構造化の仕方)などがこうする方が良い。私はこうしている。などありましたらそちらの方も一言教えていただけると幸いです。

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

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

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

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

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

guest

回答1

0

ベストアンサー

Firebase Storageから画像をダウンロードしてUIImageViewに表示したい場合、一番お手軽なのは公式で用意されている FirebaseUI を使用することです。

公式ドキュメント: https://firebase.google.com/docs/storage/ios/download-files?hl=ja#downloading_images_with_firebaseui

投稿2018/03/28 12:19

編集2018/03/28 12:24
kakajika

総合スコア3131

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

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

sam3457

2018/03/29 04:52

回答ありがとうございます。いつもお世話になっております。 FirebaseUI、導入試して見ます! RDBなのですが、画像を抜いたのでusericonやpostimageなどの項目はデータ構造から無くしてしまってもいいのでしょうか?
kakajika

2018/03/29 05:23

各userやpostに対応する画像が必ず1つであるなら、Storageへの参照も1対1で対応するので無くしてしまっていいと思います。 1つの投稿に複数の画像を添付したいと言うようなことになった場合はStorageへの参照も複数必要になりますから、それらに対応するIDなどをRDB側に保存しなければなりません。
sam3457

2018/03/29 08:32

お返事ありがとうございます。 複数の画像は、アップロードした時のIDを同時にRDBにも画像の参照として保存しておき、取り出すときはRDBから画像以外の投稿データと画像のIDを得てそのIDで画像を表示するという感じですね! 段々とSNSの仕組みがわかってきました!本当にありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問