john smith
john smith

Reputation: 85

Passing Firebase database reference data

I'm looking to pass an array that contains user info pulled from Firebase from one controller to another using a segue. I'm able to do it when everything is in a tableview, but not when it's in a regular controller view. Can someone help plz?

View Controller

var userArray = [User]()

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    if segue.identifier == "showGuestView" {
        let guestVC = segue.destination as! GuestUserViewController
             guestVC.ref = userArray.ref //this would work using userArray[indexPath.row].ref if it was a tableview
             //ref represents DatabaseReference?
        }
    }

 DatabaseClass.fetchUser() { (user) in
    if let user = user {
       self.userArray.append(user)
 }

Database Class

func fetchUser(completion: @escaping (User?)->()){

    let currentUser = Auth.auth().currentUser!

    let postRef = Database.database().reference().child("getinfo").child(currentUser.uid)

    postRef.observe(.value, with: { (snapshot) in
        for childSnapshot in snapshot.children.allObjects as! [DataSnapshot] {
            let request = childSnapshot.key
            let userRef = self.databaseRef.child("users").child(request)

            userRef.observeSingleEvent(of: .value, with: { (currentUser) in

                let user: User = User(snapshot: currentUser)
                completion(user)
            })
        }
    })
}

User Structure

struct User {

    var firstname: String!
    var uid: String!
    var ref: DatabaseReference!

    init(firstname: String, uid: String){        
        self.firstname = firstname          
        self.uid = uid            
        self.ref = Database.database().reference()           
    }

    init(snapshot: DataSnapshot){

        if let snap = snapshot.value as? [String:Any] {               
            self.firstname = snap["firstname"] as! String
            self.uid = snap["uid"] as! String         
        }   
        self.ref = snapshot.ref
    }

    func toAnyObject() -> [String: Any]{
        return ["firstname":self.firstname, "uid":self.uid]
    }
}

Upvotes: 1

Views: 399

Answers (1)

Shamim Hossain
Shamim Hossain

Reputation: 1760

I can see userArray is an array of users, hence you could not use userArray.ref because the array doesn't have any property like ref in its definition. In the table view, it is working because you pulled a user object and then passed ref.

Try to get a selected user instance before passing to the guest view controller.

let user =  userArray[selected user index];
guestVC.ref = user.ref

Upvotes: 1

Related Questions