简体   繁体   中英

get data from firebase children

I have two custom cells in one table view.

 func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        // Configure the cell...
     if (indexPath.row == 0) {
        let cell = tableView.dequeueReusableCell(withIdentifier: "Main", for: indexPath) as! PostTableViewCell

        //Configure the cell

        cell.PostView.layer.cornerRadius = 5
        cell.PostView.layer.masksToBounds = false
        cell.PostView.layer.shadowColor = UIColor.black.withAlphaComponent(0.4).cgColor
        cell.PostView.layer.shadowOffset = CGSize(width: 0, height: 0)
        cell.PostView.layer.shadowOpacity = 0.9

        let post = Comments[indexPath.row] as! [String: AnyObject]
        let commentname = post["author"] as? String
        sendAuthor = post["author"] as? String
        cell.CommentersName.setTitle(commentname, for: .normal)

        if let seconds = post["pub_time"] as? Double {
            let timeStampDate = NSDate(timeIntervalSince1970: seconds/1000)
            let dateFormatter = DateFormatter()
            dateFormatter.dateFormat = "MMM d, yyyy"
            let formating = timeStampDate as Date


            cell.CommentTime.text = dateFormatter.string(from: formating)


        }

        cell.comment.text = post["content"] as? String


         textViewDidChange(cell.comment)

        cell.comment.frame.size.width = 344
        cell.comment.sizeToFit()
        cell.comment.clipsToBounds = true

        cell.REply.frame.origin.y = cell.comment.frame.maxY + 10
        cell.PostView.frame.size.height =  cell.comment.frame.maxY + 50
        TableView.rowHeight = cell.PostView.frame.size.height + 20


        cell.LikesNumber.text = post["num_likes"] as? String


        replyId = post["id"] as? String

        cell.checkfornightmode()

        return cell
       }
          else{

        let cell = tableView.dequeueReusableCell(withIdentifier: "Reply", for: indexPath) as! RepliesTableViewCell



            cell.ReplyCustomCell.layer.cornerRadius = 5
            cell.ReplyCustomCell.layer.masksToBounds = false
            cell.ReplyCustomCell.layer.shadowColor = UIColor.black.withAlphaComponent(0.4).cgColor
            cell.ReplyCustomCell.layer.shadowOffset = CGSize(width: 0, height: 0)
            cell.ReplyCustomCell.layer.shadowOpacity = 0.9

        let post = Comments[indexPath.row] as! [String: AnyObject]

        let posttest = post["id"] as? String

        let replyRef = Database.database().reference().child("main").child("posts").child(postID!).child("comments").child(posttest!).child("comments")


        replyRef.observeSingleEvent(of: .value, with: { (snapshot:DataSnapshot) in

            if let postsDictionary = snapshot .value as? [String: AnyObject] {



                for testingkey in postsDictionary.keys {


                    Database.database().reference().child("main").child("posts").child(self.postID!).child("comments").child(posttest!).child("comments").child(testingkey).observeSingleEvent(of: .value, with: { (snapshot) in

                        let value = snapshot.value as? NSDictionary

                        let content : String? = value?["content"] as? String ?? ""

                       cell.ReplyText.text = content!

                    })
                }



            }

        })


        TableView.rowHeight = 150.0


            return cell
       }
    }

The first cell with the identifier main is supposed to print out all the intial comments for a certain post. The second cell with the identifier is supposed to print out the comments to main comments. Based on this code, I am only getting the last comment of the main post and the last comment to the main posts.

This is what the json looks like 在此处输入图片说明 在此处输入图片说明

  1. First thing is to separate the firebase call into a separate function and in that function populate a dictionary with posts as key and comments as value

for example like this

var postComments: [String: [String]] = [:] // post as key and string array as comments
  1. In firebase database call populate this with snapshot.

After the data call but within the firebase Database call back use this function to reload data

DispatchQueue.main.async{
  tableView.reloadData() 
}
  1. Set the cell with postComments array.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM