質問編集履歴

2 j

sam3457

sam3457 score 44

2018/03/28 20:04  投稿

FirebaseStorageのダウンロード方法
SNSアプリ(twitter,insta系)を作っています。
Authを使ったログイン機能・ RealtimeDatabaseを使った投稿機能・プロフィールの保存機能が実装されています。
RDBの構造はこの様な形です
![イメージ説明](0ba9fb2ffcbf097db93885702b548dc0.png)
ご覧の様に画像データ(投稿画像・アイコン画像)は圧縮、エンコードして文字列として保存していました。
しかし、RDBに画像の様な大容量のデータを保存するのはRDBの容量を圧迫するため、代わりにFirebaseStorageを使うと良いとのアドバイスをいただきました。
そこでまずプロフィールの名前はRDB、アイコン画像はStorageにアップロードするコードを書いてみました。
![イメージ説明](97f4c21ab0d0b3d772f2287c77a70af9.png)
``` swift
//userdefaultとサーバに送る
   @IBAction func changeProfile(_ sender: Any) {
       
       
       
       //userdefaultに保存
       
       //名前
       let username = nameTextField.text
       userDefault.set(username, forKey: "username")
       
       //アイコン画像
       var data: Data = Data()
       if let image = iconImageView.image {
           data = UIImageJPEGRepresentation(image, 0.1)! as Data
       }
       let encodedIcon = data.base64EncodedString(options: Data.Base64EncodingOptions.lineLength64Characters) as String
       userDefault.set(encodedIcon, forKey: "usericon")
       
       
       //サーバにアップロード
       let uid = Auth.auth().currentUser?.uid
       
       //名前はRDBに保存
       let RDBref = Database.database().reference()
       let prof: Dictionary = ["username": username]
       RDBref.child("profs").child(uid!).setValue(prof)
     
       //アイコンは(初期画像でなければ)Storageに保存
       if iconImageView.image != UIImage(named: "user.png") {
           let storageRef = Storage.storage().reference()
           storageRef.child("usericons").child(uid!).putData(data, metadata: nil)
       }
       KRProgressHUD.showSuccess(withMessage: "変更しました")
       
   }
```
RDBと同じ様にusericonsというchildを作り、その中にchild(uid)で保存しました。
アップロードはできたのですがStorageに保存したものをダウンロードする際の方法が[公式ページ](https://firebase.google.com/docs/storage/ios/download-files?authuser=0)を見たところどうやら三つあるらしく、現在どの方法を使えば良いのか悩んでおります。
![イメージ説明](f90a33a0f7022c7702e88e69b0cfabf0.png)
ちなみにRDB・storageにアップロードしたプロフィール情報(名前とアイコン画像)はこの先タイムラインに投稿画像一枚と一緒にcollectionviewの一つのcellとして表示する予定です。
![イメージ説明](3e16f7ddb2123a8912dc949668eb362e.png)
① この様な実装を考えたとき、皆様はどの様な方法で画像をダウンロードしていますでしょうか?
この様な実装を考えたとき、
① 皆様はどの様な方法で画像をダウンロードしていますでしょうか?
② また、アップロードの仕方(RDBとStorageの構造化の仕方)などがこうする方が良い。私はこうしている。などありましたらそちらの方も一言教えていただけると幸いです。
  • Xcode

    5019 questions

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

  • Swift

    8908 questions

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

  • Firebase

    966 questions

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

1 k

sam3457

sam3457 score 44

2018/03/28 19:51  投稿

FirebaseStorageのダウンロード方法
SNSアプリ(twitter,insta系)を作っています。
Authを使ったログイン機能・ RealtimeDatabaseを使った投稿機能・プロフィールの保存機能が実装されています。
RDBの構造はこの様な形です
![イメージ説明](0ba9fb2ffcbf097db93885702b548dc0.png)
ご覧の様に画像データ(投稿画像・アイコン画像)は圧縮、エンコードして文字列として保存していました。
しかし、RDBに画像の様な大容量のデータを保存するのはRDBの容量を圧迫するため、代わりにFirebaseStorageを使うと良いとのアドバイスをいただきました。
そこでまずプロフィールの名前はRDB、アイコン画像はStorageにアップロードするコードを書いてみました。
![イメージ説明](97f4c21ab0d0b3d772f2287c77a70af9.png)
``` swift
//userdefaultとサーバに送る
   @IBAction func changeProfile(_ sender: Any) {
       
       
       
       //userdefaultに保存
       
       //名前
       let username = nameTextField.text
       userDefault.set(username, forKey: "username")
       
       //アイコン画像
       var data: Data = Data()
       if let image = iconImageView.image {
           data = UIImageJPEGRepresentation(image, 0.1)! as Data
       }
       let encodedIcon = data.base64EncodedString(options: Data.Base64EncodingOptions.lineLength64Characters) as String
       userDefault.set(encodedIcon, forKey: "usericon")
       
       
       //サーバにアップロード
       let uid = Auth.auth().currentUser?.uid
       
       //名前はRDBに保存
       let RDBref = Database.database().reference()
       let prof: Dictionary = ["username": username]
       RDBref.child("profs").child(uid!).setValue(prof)
     
       //アイコンは(初期画像でなければ)Storageに保存
       if iconImageView.image != UIImage(named: "user.png") {
           let storageRef = Storage.storage().reference()
           storageRef.child("usericons").child(uid!).putData(data, metadata: nil)
       }
       KRProgressHUD.showSuccess(withMessage: "変更しました")
       
   }
```
RDBと同じ様にusericonsというchildを作り、その中にchild(uid)で保存しました。
アップロードはできたのですがStorageに保存したものをダウンロードする際の方法が[公式ページ](https://firebase.google.com/docs/storage/ios/download-files?authuser=0)を見たところどうやら三つあるらしく、現在どの方法を使えば良いのか悩んでおります。
![イメージ説明](f90a33a0f7022c7702e88e69b0cfabf0.png)
ちなみにRDB・storageにアップロードしたプロフィール情報(名前とアイコン画像)はこの先タイムラインに投稿画像一枚と一緒にcollectionviewの一つのcellとして表示する予定です。
![イメージ説明](3e16f7ddb2123a8912dc949668eb362e.png)
この様な実装を考えたとき、皆様はどの様な方法で画像をダウンロードしていますでしょうか?
この様な実装を考えたとき、皆様はどの様な方法で画像をダウンロードしていますでしょうか?
また、アップロードの仕方(RDBとStorageの構造化の仕方)などがこうする方が良い。私はこうしている。などありましたらそちらの方も一言教えていただけると幸いです。
また、アップロードの仕方(RDBとStorageの構造化の仕方)などがこうする方が良い。私はこうしている。などありましたらそちらの方も一言教えていただけると幸いです。
  • Xcode

    5019 questions

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

  • Swift

    8908 questions

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

  • Firebase

    966 questions

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

思考するエンジニアのためのQ&Aサイト「teratail」について詳しく知る