Search code examples
iosswiftfirebasefirebase-realtime-databasejsqmessagesviewcontroller

Can't access Firebase child


I have a firebase database reference

FIRDatabase.database().reference().child("messages").child("\(self.convoId!)").childByAutoId()

I want to access the ReceiverName from my firebase database in DisplayViewController, but when I call the database reference, I get an error because of convoId. This is how convoId was declared (in MessagesViewController).

 override func viewDidLoad() {
        super.viewDidLoad()
  let receiverId = receiverData as! String
        let receiverIdFive = String(receiverId.characters.prefix(5))
        let senderIdFive = String(senderId.characters.prefix(5))
        if (senderIdFive > receiverIdFive)
        {
            self.convoId = senderIdFive + receiverIdFive
        }
        else
        {
            self.convoId = receiverIdFive + senderIdFive
}
    }

receiverData was passed from UserviewController to MessagesViewController and "senderId" is the string identifier that uniquely identifies the current user sending messages and is automatically declared in JSQMessagesViewController.h. so essentially, I can't redeclare convoId in my DisplayViewController. However, in DisplayViewController, I need to access ReceiverName.

This is how I attempted to retrieve ReceiverName:

let rootRef = FIRDatabase.database().reference()        
rootRef.child("messages").observeSingleEvent(of: .value) { 
    (snapshot: FIRDataSnapshot) in
    let loggedInUserData = snapshot
    if let postsDictionary = snapshot .value as? [String: AnyObject] {
        for post in postsDictionary {
            self.messages.add(post.value)
        }
        self.MessageTableView.reloadData()
    }
}

Then I populate the derived data in a tableviewcell:

override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCell(withIdentifier: "MessageCell", for: indexPath) as! MessageTableViewCell


    //Configure the cell


    print(messages[indexPath.row])
    let message = self.messages[indexPath.row] as! [String: AnyObject]
    cell.SellerName.text = message["ReceiverName"] as? String

       return cell
}

Solution

  • Try this inside your observeSingleEvent function:

    ...
    for post in postsDictionary {
        let messages = post.value as! [String: AnyObject]
        for (id, value) in messages {
            let info = value as! [String: AnyObject]
            let receiver = info["ReceiverName"]!
            print("\(id): \(receiver)")
            self.messages.add(value)
        }
    }
    ...