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での画像のダウンロードはできないのでしょうか?
かなり長くなってしまいましたがご存知の方がいらっしゃいましたらよろしくお願いいたします。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/04/04 03:35