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

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

ただいまの
回答率

90.34%

  • Swift

    9429questions

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

  • Firebase

    1067questions

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

  • TableView

    152questions

    TableView(UITableView)とは、リスト形式で表示するコントロールで、ほとんどのアプリに使用されています。画面を「行」に分けて管理し、一般的には各行をタップした際に詳細画面に移動します。

【Swift】Firebaseの画像をTable Viewに表示する際のバグ

解決済

回答 1

投稿

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

ishicoro

score 17

すみません、お力添え頂けますと幸いです。。。!

やりたいこと:
チャットアプリで、最新トーク一覧の画面を作っています。
チャット相手のプロフ画像と名前、一番新しいチャットが送信された時間などを表示させたいです。

LINEに例えると、以下の画面です。
イメージ説明
名前と最新メールの時刻は正しく表示させることができましたが、プロフィール画像が、
正しい相手の画像が表示されません。Aさんのプロフ画像が、2名分の画像に表示されたり、Aさんの画像がBさんの画像のところに表示されたり、ビルドするときによって毎回バラバラです。

class NewTalkVC: UIViewController, UICollectionViewDataSource, UICollectionViewDelegate/*, FetchData*/ {
   var news = [New]()
   var newsDictionary = [String: New]()
   var friendImage: UIImage?
   var friendName: String = ""
   var friendName2: String = ""
   var toID: String = ""
   var chatPartnerId: String = ""
   var chatPartnerId2: String = ""
   var chatPartnerName: String = ""
   var messages = [Message]()

    @IBOutlet weak var NewTalkCollectionView: UICollectionView!


    override func viewDidLoad() {
        super.viewDidLoad()
       getNewTalk()
    }

    func getNewTalk() {

        let uid = Auth.auth().currentUser?.uid
        Database.database().reference().child("user-messages").child(uid!).observe(.childAdded, with: { (snapshot) in
            let messageId = snapshot.key
             DBProvider.Instance.mediaMessagesRef.child(messageId).observe(.value, with: { (snapshot) in
                 if let d = snapshot.value as? [String:AnyObject]{
                    if let sender_id    = d["sender_id"]   as? String {
                        let sender_name = d["sender_name"] as? String
                        let timeStamp   = d["timeStamp"]   as? NSNumber
                        let toID        = d["toID"]        as? String
                        let toName      = d["toName"]      as? String
                        let listened    = d["listened"]    as? Bool
                        let childkey    = d["childkey"]    as? String
                        let url         = d["url"]         as? String
                        let newMessage = New(sender_id: sender_id, sender_name: sender_name!, url:url!, toID: toID!, timeStamp: timeStamp!, childkey: childkey!, listened: listened!, toName: toName!)

                        //送り主が自分なら、表示する名前とアイコンは、受信者。送り主が自分じゃないなら、表示するのは送信者。
                        if sender_id == Auth.auth().currentUser?.uid {
                            self.chatPartnerId = toID!
                            self.newsDictionary[self.chatPartnerId] = newMessage //chatPartnerIdを基準にソートしてまとめているっぽい

                            self.news = Array(self.newsDictionary.values)
                            self.news.sort(by: {Double($0.timeStamp!) < Double($1.timeStamp!)})
                             self.NewTalkCollectionView.reloadData()
                        }


                            //送る主が自分以外で、かつ、送り先が自分であるとき
                        else if toID == Auth.auth().currentUser?.uid {
                            self.chatPartnerId = sender_id
                           self.newsDictionary[self.chatPartnerId] = newMessage
                            self.news = Array(self.newsDictionary.values)
                 self.NewTalkCollectionView.reloadData()
                        }



                    }

                    }
                    }, withCancel: nil)

                }, withCancel: nil)


    } //getNewTalk()終わり


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

    }


    func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
        let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "NewTalkCollectionViewCell", for: indexPath) as! NewTalkCollectionViewCell
       let user = news[indexPath.row] 

      //相手のIDがとりたい。自分がsenderの時は、相手であるtoIDを使う。相手がsenderの時は、senderIDを使う。
        if user.sender_id == Auth.auth().currentUser?.uid {
            self.chatPartnerId2 = user.toID!
            self.chatPartnerName = user.toName!
        } else if user.sender_id == user.toID {
            self.chatPartnerId2 = user.sender_id!
            self.chatPartnerName = user.sender_name!
        }

        cell.label.text = self.chatPartnerName

        if user.sender_id == Auth.auth().currentUser?.uid {
            cell.label.text = user.toName
        }
            //送る主が自分以外で、かつ、送り先が自分であるとき
        else if user.toID == Auth.auth().currentUser?.uid {
            cell.label.text = user.sender_name
        }


          //友達の画像を取得
        Database.database().reference().child("Contacts").child(self.chatPartnerId2).observeSingleEvent(of: .value, with: { (snapshot) in
            if let dictionary = snapshot.value as? [String:AnyObject]{

                if let profileImageUrl = dictionary["profileImageUrl"]  as? String {
                    let url = URL(string: profileImageUrl)

    URLSession.shared.dataTask(with: url!, completionHandler: { (data, response, error) in
                        DispatchQueue.global().async{
                            DispatchQueue.main.async{

                                 cell.imgImg.image = UIImage(data:data!)

                            }
                        }
                    }).resume()
                }
            }
        }, withCancel: nil)
        return cell
    }


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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 1

check解決した方法

-1

自己解決しました。Timerを使用します。
https://www.youtube.com/watch?v=JK7pHuSfLyA&t=1473

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

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

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

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

  • Swift

    9429questions

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

  • Firebase

    1067questions

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

  • TableView

    152questions

    TableView(UITableView)とは、リスト形式で表示するコントロールで、ほとんどのアプリに使用されています。画面を「行」に分けて管理し、一般的には各行をタップした際に詳細画面に移動します。