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

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

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

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

Xcode

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

Swift

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

Q&A

解決済

1回答

807閲覧

Firebase Storageの画像をCollectionViewに表示

sam3457

総合スコア52

Firebase

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

Xcode

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

Swift

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

0グッド

1クリップ

投稿2018/04/02 08:13

編集2018/04/03 08:23

firebase RealtimeDatabase・Storage・Authを使用し、画像一枚と投稿者の名前、アイコン画像をタイムラインのcollectionviewに表示するアプリを作っております。

現在はまず画像一枚をcollectionviewに表示するところを作っています。

イメージ説明

画像の保存方法はまずRDBにて、

let RDBref = Database.database().reference()
let newPostRef = RDBref.child("posts").child(uid!).childByAutoId()
let newPostID = newPostRef.key

で取得したnewPostIDを使いStorageに、

let storageRef = Storage.storage().reference()
storageRef.child("posts").child(uid!).child(newPostID).putData(data, metadata: nil)

という様に保存し、最後にRDBで画像のdownloadURLをpostimageとして保存しております。

以下が実際のコードとRDBのコンソールの構造です。

swift

1 2//セットした画像をエンコード 3 var data: Data = Data() 4 if let image = iconImageView.image { 5 data = UIImageJPEGRepresentation(image, 0.1)! as Data 6 } 7 8 //firebaseにpostを送る 9 let uid = Auth.auth().currentUser?.uid 10 11 let RDBref = Database.database().reference() 12 let newPostRef = RDBref.child("posts").child(uid!).childByAutoId() 13 let newPostID = newPostRef.key 14 15 let storageRef = Storage.storage().reference() 16 storageRef.child("posts").child(uid!).child(newPostID).putData(data, metadata: nil) { metadata, error in 17 if error != nil { 18 19 } else { 20 let downloadURL = metadata!.downloadURL() 21 let url = downloadURL?.absoluteString ?? "" 22 let post: Dictionary = ["postimage": url] 23 RDBref.child("posts").child(uid!).childByAutoId().setValue(post) 24 25 } 26 }

イメージ説明

画像の保存方法は以上となります。

以上の様に保存した画像(全posts画像)をcollectionviewに表示するとき、
まずRDBにあるposts内の全postimageのdownloadURLを取ってくる必要があると思うのですが、
それをloadAllData()内で記述しています。(ここも間違っているかもしれません、、)

そして取得したdownloadURLを、
collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath)内で、
FirebaseUIの.sd_setImage(with: )で表示する処理を記述しております。

以下がタイムラインであるcollectionviewのコードのすべてとなります。

swift

1import UIKit 2import Firebase 3import FirebaseStorageUI 4 5class PostList: UICollectionViewController { 6 7 var items = [NSDictionary]() 8 9 override func viewDidLoad() { 10 super.viewDidLoad() 11 12 //ログインチェック 13 if UserDefaults.standard.object(forKey: "check") != nil { 14 //何もしない 15 } else { 16 let loginViewController = self.storyboard?.instantiateViewController(withIdentifier: "login") 17 self.present(loginViewController!, animated: true, completion: nil) 18 } 19 20 loadAllData() 21 collectionView?.reloadData() 22 23 } 24 25 @IBAction func loginOrOut(_ sender: Any) { 26 performSegue(withIdentifier: "goLogin", sender: nil) 27 } 28 29 30 //RDBにある投稿画像の参照(URL)を取ってくる 31 func loadAllData() { 32 33 let RDBRef = Database.database().reference().child("posts") 34 RDBRef.queryLimited(toLast: 10).observe(.value) { (snapshot,error) in 35 36 var tempItems = [NSDictionary]() 37 for item in(snapshot.children) { 38 39 let child = item as! DataSnapshot 40 let dict = child.value 41 tempItems.append(dict as! NSDictionary) 42 43 } 44 self.items = tempItems 45 self.items = self.items.reversed() 46 self.collectionView?.reloadData() 47 48 } 49 50 } 51 52 override func didReceiveMemoryWarning() { 53 super.didReceiveMemoryWarning() 54 } 55 56 /* 57 // MARK: - Navigation 58 59 // In a storyboard-based application, you will often want to do a little preparation before navigation 60 override func prepare(for segue: UIStoryboardSegue, sender: Any?) { 61 // Get the new view controller using [segue destinationViewController]. 62 // Pass the selected object to the new view controller. 63 } 64 */ 65 66 // MARK: UICollectionViewDataSource 67 68 override func numberOfSections(in collectionView: UICollectionView) -> Int { 69 return 1 70 } 71 72 73 override func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int { 74 return items.count 75 } 76 77 override func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell { 78 let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "cell", for: indexPath) 79 80 //とりあえず投稿画像だけ 81 let postImageView = cell.contentView.viewWithTag(1) as! UIImageView 82 //let iconImageView = cell.contentView.viewWithTag(2) as! UIImageView 83 //let nameLabel = cell.contentView.viewWithTag(3) as! UIImageView 84 85 //Storageから画像を表示 86 let storageRef = Storage.storage().reference() 87 let ref = storageRef.child("posts") 88 postImageView.sd_setImage(with: ref) 89 90 return cell 91 } 92 93 94} 95

以上が書いたコードなのですが、RDBから取ってきたdownloadURLを使い、どう表示するかがわかりませんでした。
firebaseUIはdownloadURLでの画像のダウンロードはできないのでしょうか?

かなり長くなってしまいましたがご存知の方がいらっしゃいましたらよろしくお願いいたします。

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

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

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

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

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

guest

回答1

0

ベストアンサー

いくつか混乱されているところがあるようですが、とりあえずStorageからの画像ダウンロードについて回答します。

1. StorageのdownloadURLの必要性について

FirebaseUIの提供するStorage上の画像をUIImageViewに表示する機能は、StorageReferenceから直接画像をダウンロードして表示するのを目的としたものであり、downloadURLを用意する必要はありません。

downloadURLを使う場合とそうでない場合とで以下のような違いがあるのでアプリの要件に従ってどちらかに統一するとよいです。

downloadURLを使う場合

  • 他の一般的なURLと同じように扱えるので、Storageに保存した画像以外もURLを指定してDBに保存できる
  • Webアプリでも扱いやすい
  • 後述するような画像キャッシュライブラリが使えるので色々なオプションが利用できたり、カスタマイズの情報が得やすい

StorageReferenceから直接ダウンロードする場合

  • downloadURLを公開する必要が無いので、画像へのアクセスをアプリ利用者のみに制限できる
  • URLが必要になったらその場でdownloadURLを生成してしまえばよい

2. URLからの画像のダウンロードについて

URLから画像をダウンロードしてUIImageViewに表示するには、自前でダウンロード処理を実装することもできますが、頻繁にダウンロードするのを防止するためにキャッシュを実装することなども考えると外部ライブラリを使ってしまうのが楽です。

有名な画像キャッシュライブラリがいくつもあるので、色々試してみて使い勝手のよいものを選ぶことをオススメします。

参考: https://qiita.com/H_Crane/items/422811dfc18ae919f8a4

投稿2018/04/03 11:50

編集2018/04/03 12:07
kakajika

総合スコア3131

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

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

sam3457

2018/04/04 03:35

回答ありがとうございます!いつも大変お世話になっております。 referenceから直接ダウンロードとURLからのダウンロードではその様な違いがあるのですね、、 非常に参考になります! これからいろいろDB構造や機能を拡張していくとなるとキャッシュも必要になってくると思うので、kakajika様のおっしゃる様に画像キャッシュライブラリを試してみようかと思います! 素晴らしい記事のリンクありがとうございます!早速読んでみます! モヤモヤしてた部分が綺麗になりました! ありがとうございますm(_ _)m
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問