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

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

ただいまの
回答率

90.87%

  • Swift

    6459questions

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

  • Xcode

    3733questions

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

  • Firebase

    457questions

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

uidで紐付けたデータをまとめて表示させる

受付中

回答 0

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 95

son

score 42

firebaseを使い、collectionviewに投稿画像・投稿主の名前・アイコン画像も三つを一つのセルとして表示する機能を作っています。

現在、三つデータのうちの一つである投稿画像の表示のみができている状態です。下の方にコンソールの画像があります。

投稿画像: Storageに保存した画像のURLをRDBに保存
posts-uid-postID-postimage

投稿主の名前: RDBに以下の様に保存
profs-uid-username

投稿主のアイコン画像: Storageに直接保存
usericons-uid-アイコン画像

以上の様に三つのデータ同士はuidで紐ずいている状態です。

これら三つを一つのセルとして表示するにはまずuidを取得し、そのuidを元に投稿主の名前・アイコン画像を投稿画像にに割り当てる。という手順が必要になると思っているのですが、

投稿画像(posts-uid-postID-postimage)の2階層上であるuidを取得する方法はありますでしょうか?

現在、投稿画像のみが表示できている状態なのですが、どの様な手順でuidで繋がった異なる階層にあるデータ同士をマッチさせるのでしょうか?

また、そもそももっと効率的な方法がある。こういう構造にしたほうがいい。などありましたら一言お教えいただけると幸いです。

イメージ説明

RDB
イメージ説明
Storage
イメージ説明

import UIKit
import Firebase
import SDWebImage

class PostList: UICollectionViewController {

    var posts = [NSDictionary]()

    override func viewDidLoad() {
        super.viewDidLoad()

        //ログインチェック
        if UserDefaults.standard.object(forKey: "check") != nil {
            //何もしない
        } else {
            let loginViewController = self.storyboard?.instantiateViewController(withIdentifier: "login")
            self.present(loginViewController!, animated: true, completion: nil)
        }

        loadAllData()


    }
    override func viewWillAppear(_ animated: Bool) {
        super.viewWillAppear(true)

        loadAllData()
    }

    @IBAction func loginOrOut(_ sender: Any) {
        performSegue(withIdentifier: "goLogin", sender: nil)
    }


    //RDBにある投稿画像の参照(URL)を取ってくる
    func loadAllData() {

        let RDBRef = Database.database().reference().child("posts")
        RDBRef.queryLimited(toLast: 20).observe(DataEventType.childAdded, with: { (snapshot) in
            var tempPosts = [NSDictionary]()
            for post in(snapshot.children) {

                let child = post as! DataSnapshot
                let dict = child.value
                tempPosts.append(dict as! NSDictionary)
            }
            self.posts = tempPosts
            self.collectionView?.reloadData()

        })

    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
    }

    /*
    // MARK: - Navigation

    // In a storyboard-based application, you will often want to do a little preparation before navigation
    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        // Get the new view controller using [segue destinationViewController].
        // Pass the selected object to the new view controller.
    }
    */

    // MARK: UICollectionViewDataSource

    override func numberOfSections(in collectionView: UICollectionView) -> Int {
        return 1
    }


    override func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
        return posts.count
    }

    override func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
        let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "cell", for: indexPath)

        let dict = posts[indexPath.item]

        //投稿画像(postimageを表示)
        let postImageView = cell.contentView.viewWithTag(1) as! UIImageView
        let postStr = dict["postimage"] as? String
        let postUrl = URL(string: postStr!)
        postImageView.sd_setImage(with: postUrl)

        //let iconImageView = cell.contentView.viewWithTag(2) as! UIImageView
        //let nameLabel = cell.contentView.viewWithTag(3) as! UIImageView




        return cell
    }


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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

まだ回答がついていません

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

  • ただいまの回答率 90.87%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • Swift

    6459questions

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

  • Xcode

    3733questions

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

  • Firebase

    457questions

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